```json
{
  "sym_variables": [
    ("x0", "bananas"),
    ("x1", "rotisserie chickens"),
    ("x2", "bowls of instant ramen"),
    ("x3", "apples")
  ],
  "objective_function": "3.79 * x0 + 6.29 * x1 + 3.04 * x2 + 4.52 * x3",
  "constraints": [
    "7 * x0 + 10 * x3 >= 120",
    "14 * x1 + 22 * x3 >= 63",
    "4 * x0 + 14 * x1 >= 47",
    "14 * x1 + 9 * x2 >= 50",
    "6 * x0 + 16 * x3 <= 265",
    "20 * x1 + 16 * x3 <= 291",
    "6 * x0 + 20 * x1 + 23 * x2 + 16 * x3 <= 291",
    "7 * x0 + 10 * x3 <= 462",
    "5 * x1 + 11 * x2 <= 130",
    "5 * x1 + 10 * x3 <= 199",
    "7 * x0 + 5 * x1 <= 463",
    "7 * x0 + 5 * x1 + 11 * x2 + 10 * x3 <= 463",
    "14 * x1 + 22 * x3 <= 430",
    "4 * x0 + 9 * x2 <= 213",
    "4 * x0 + 14 * x1 + 9 * x2 + 22 * x3 <= 213",
    "21 * x0 + 21 * x3 <= 74",
    "21 * x0 + 16 * x1 <= 132",
    "16 * x1 + 21 * x3 <= 90",
    "21 * x0 + 21 * x2 <= 99",
    "16 * x1 + 21 * x2 + 21 * x3 <= 113",
    "21 * x0 + 16 * x1 + 21 * x3 <= 177",
    "21 * x0 + 16 * x1 + 21 * x2 + 21 * x3 <= 177"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
bananas = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="bananas")
rotisserie_chickens = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="rotisserie_chickens")
instant_ramen = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="instant_ramen")
apples = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="apples")

# Set objective function
m.setObjective(3.79 * bananas + 6.29 * rotisserie_chickens + 3.04 * instant_ramen + 4.52 * apples, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(7 * bananas + 10 * apples >= 120)
m.addConstr(14 * rotisserie_chickens + 22 * apples >= 63)
m.addConstr(4 * bananas + 14 * rotisserie_chickens >= 47)
m.addConstr(14 * rotisserie_chickens + 9 * instant_ramen >= 50)
m.addConstr(6 * bananas + 16 * apples <= 265)
m.addConstr(20 * rotisserie_chickens + 16 * apples <= 291)
m.addConstr(6 * bananas + 20 * rotisserie_chickens + 23 * instant_ramen + 16 * apples <= 291)
m.addConstr(7 * bananas + 10 * apples <= 462)
m.addConstr(5 * rotisserie_chickens + 11 * instant_ramen <= 130)
m.addConstr(5 * rotisserie_chickens + 10 * apples <= 199)
m.addConstr(7 * bananas + 5 * rotisserie_chickens <= 463)
m.addConstr(7 * bananas + 5 * rotisserie_chickens + 11 * instant_ramen + 10 * apples <= 463)
m.addConstr(14 * rotisserie_chickens + 22 * apples <= 430)
m.addConstr(4 * bananas + 9 * instant_ramen <= 213)
m.addConstr(4 * bananas + 14 * rotisserie_chickens + 9 * instant_ramen + 22 * apples <= 213)
m.addConstr(21 * bananas + 21 * apples <= 74)
m.addConstr(21 * bananas + 16 * rotisserie_chickens <= 132)
m.addConstr(16 * rotisserie_chickens + 21 * apples <= 90)
m.addConstr(21 * bananas + 21 * instant_ramen <= 99)
m.addConstr(16 * rotisserie_chickens + 21 * instant_ramen + 21 * apples <= 113)
m.addConstr(21 * bananas + 16 * rotisserie_chickens + 21 * apples <= 177)
m.addConstr(21 * bananas + 16 * rotisserie_chickens + 21 * instant_ramen + 21 * apples <= 177)


# Optimize model
m.optimize()

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

```
