```json
{
  "sym_variables": [
    ("x0", "bananas"),
    ("x1", "bowls of pasta"),
    ("x2", "potatoes"),
    ("x3", "hamburgers")
  ],
  "objective_function": "8.09*x0 + 5.1*x1 + 8.86*x2 + 4.19*x3",
  "constraints": [
    "3.93*x0 <= 328",
    "1.31*x0 <= 437",
    "0.31*x1 <= 328",
    "4.86*x1 <= 437",
    "1.51*x2 <= 328",
    "2.44*x2 <= 437",
    "1.57*x3 <= 328",
    "1.43*x3 <= 437",
    "0.31*x1 + 1.51*x2 >= 67",
    "3.93*x0 + 1.57*x3 >= 77",
    "0.31*x1 + 1.57*x3 >= 63",
    "1.51*x2 + 1.57*x3 >= 32",
    "3.93*x0 + 0.31*x1 >= 60",
    "3.93*x0 + 1.51*x2 + 1.57*x3 >= 60",
    "3.93*x0 + 0.31*x1 + 1.57*x3 >= 60",
    "3.93*x0 + 1.51*x2 + 1.57*x3 >= 68",
    "3.93*x0 + 0.31*x1 + 1.57*x3 >= 68",
    "3.93*x0 + 0.31*x1 + 1.51*x2 + 1.57*x3 >= 68",
    "4.86*x1 + 2.44*x2 >= 106",
    "2.44*x2 + 1.43*x3 >= 41",
    "1.31*x0 + 2.44*x2 >= 64",
    "1.31*x0 + 4.86*x1 >= 46",
    "1.31*x0 + 1.43*x3 >= 61",
    "4.86*x1 + 1.43*x3 >= 102",
    "1.31*x0 + 4.86*x1 + 2.44*x2 + 1.43*x3 >= 102",
    "-5*x1 + 5*x3 >= 0",
    "2*x1 - 7*x2 >= 0",
    "-1*x2 + 4*x3 >= 0",
    "3.93*x0 + 0.31*x1 + 1.57*x3 <= 212",
    "3.93*x0 + 0.31*x1 + 1.51*x2 <= 188",
    "4.86*x1 + 1.43*x3 <= 431",
    "1.31*x0 + 1.43*x3 <= 113",
    "1.31*x0 + 4.86*x1 <= 136",
    "2.44*x2 + 1.43*x3 <= 185",
    "1.31*x0 + 2.44*x2 <= 418",
    "1.31*x0 + 2.44*x2 + 1.43*x3 <= 127",
    "1.31*x0 + 4.86*x1 + 2.44*x2 <= 260",
    "3.93*x0 + 0.31*x1 + 1.51*x2 + 1.57*x3 <= 328", 
    "1.31*x0 + 4.86*x1 + 2.44*x2 + 1.43*x3 <= 437"
  ]
}
```

```python
import gurobipy as gp
from gurobipy import GRB

# Create a new model
m = gp.Model("food_optimization")

# Create variables
bananas = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="bananas")
pasta = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="bowls_of_pasta")
potatoes = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="potatoes")
hamburgers = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="hamburgers")


# Set objective function
m.setObjective(8.09 * bananas + 5.1 * pasta + 8.86 * potatoes + 4.19 * hamburgers, GRB.MINIMIZE)

# Add constraints
m.addConstr(0.31 * pasta + 1.51 * potatoes >= 67)
m.addConstr(3.93 * bananas + 1.57 * hamburgers >= 77)
m.addConstr(0.31 * pasta + 1.57 * hamburgers >= 63)
m.addConstr(1.51 * potatoes + 1.57 * hamburgers >= 32)
m.addConstr(3.93 * bananas + 0.31 * pasta >= 60)
m.addConstr(3.93 * bananas + 1.51 * potatoes + 1.57 * hamburgers >= 60)
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.57 * hamburgers >= 60)
m.addConstr(3.93 * bananas + 1.51 * potatoes + 1.57 * hamburgers >= 68)
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.57 * hamburgers >= 68)
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.51 * potatoes + 1.57 * hamburgers >= 68)
m.addConstr(4.86 * pasta + 2.44 * potatoes >= 106)
m.addConstr(2.44 * potatoes + 1.43 * hamburgers >= 41)
m.addConstr(1.31 * bananas + 2.44 * potatoes >= 64)
m.addConstr(1.31 * bananas + 4.86 * pasta >= 46)
m.addConstr(1.31 * bananas + 1.43 * hamburgers >= 61)
m.addConstr(4.86 * pasta + 1.43 * hamburgers >= 102)
m.addConstr(1.31 * bananas + 4.86 * pasta + 2.44 * potatoes + 1.43 * hamburgers >= 102)
m.addConstr(-5 * pasta + 5 * hamburgers >= 0)
m.addConstr(2 * pasta - 7 * potatoes >= 0)
m.addConstr(-1 * potatoes + 4 * hamburgers >= 0)
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.57 * hamburgers <= 212)
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.51 * potatoes <= 188)
m.addConstr(4.86 * pasta + 1.43 * hamburgers <= 431)
m.addConstr(1.31 * bananas + 1.43 * hamburgers <= 113)
m.addConstr(1.31 * bananas + 4.86 * pasta <= 136)
m.addConstr(2.44 * potatoes + 1.43 * hamburgers <= 185)
m.addConstr(1.31 * bananas + 2.44 * potatoes <= 418)
m.addConstr(1.31 * bananas + 2.44 * potatoes + 1.43 * hamburgers <= 127)
m.addConstr(1.31 * bananas + 4.86 * pasta + 2.44 * potatoes <= 260)

# Resource Constraints
m.addConstr(3.93 * bananas + 0.31 * pasta + 1.51 * potatoes + 1.57 * hamburgers <= 328)
m.addConstr(1.31 * bananas + 4.86 * pasta + 2.44 * potatoes + 1.43 * hamburgers <= 437)


# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == GRB.INFEASIBLE:
    print('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```