```json
{
  "sym_variables": [
    ("x0", "bowls of instant ramen"),
    ("x1", "steaks"),
    ("x2", "peanutbutter sandwiches"),
    ("x3", "granola bars")
  ],
  "objective_function": "3.62*x0**2 + 4.63*x0*x1 + 5.03*x0*x3 + 2.07*x1**2 + 6.03*x1*x2 + 3.6*x1*x3 + 6.97*x2**2 + 7.45*x2*x3 + 4.02*x3**2 + 9.15*x0 + 9.81*x1 + 8.4*x3",
  "constraints": [
    "7.74*x0 + 6.01*x2 >= 29",
    "8.37**2*x2**2 + 1.67**2*x3**2 <= 44",
    "3.51*x0 + 0.65*x1 <= 59",
    "3.51*x0 + 8.37*x2 <= 104",
    "0.65**2*x1**2 + 1.67**2*x3**2 <= 95",
    "3.51*x0 + 0.65*x1 + 8.37*x2 <= 65",
    "3.51*x0 + 0.65*x1 + 8.37*x2 + 1.67*x3 <= 65",
    "5.28**2*x1**2 + 7.08**2*x2**2 <= 59",
    "1.79*x0 + 7.08*x2 <= 56",
    "1.79*x0 + 5.28*x1 <= 109",
    "5.28**2*x1**2 + 7.75**2*x3**2 <= 85",
    "1.79*x0 + 5.28*x1 + 7.08*x2 + 7.75*x3 <= 85",
    "7.74*x0 + 6.01*x2 <= 140",
    "7.74**2*x0**2 + 7.62**2*x3**2 <= 56",
    "7.25*x1 + 6.01*x2 <= 105",
    "7.74*x0 + 7.25*x1 + 6.01*x2 + 7.62*x3 <= 105",
    "3.51*x0 <= 139",
    "1.79*x0 <= 203",
    "7.74*x0 <= 161",
    "0.65*x1 <= 139",
    "5.28*x1 <= 203",
    "7.25*x1 <= 161",
    "8.37*x2 <= 139",
    "7.08*x2 <= 203",
    "6.01*x2 <= 161",
    "1.67*x3 <= 139",
    "7.75*x3 <= 203",
    "7.62*x3 <= 161"
  ]
}
```

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

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

# Create variables
x0 = m.addVar(vtype=GRB.INTEGER, name="x0") # bowls of instant ramen
x1 = m.addVar(vtype=GRB.INTEGER, name="x1") # steaks
x2 = m.addVar(vtype=GRB.INTEGER, name="x2") # peanutbutter sandwiches
x3 = m.addVar(vtype=GRB.INTEGER, name="x3") # granola bars


# Set objective function
m.setObjective(3.62*x0**2 + 4.63*x0*x1 + 5.03*x0*x3 + 2.07*x1**2 + 6.03*x1*x2 + 3.6*x1*x3 + 6.97*x2**2 + 7.45*x2*x3 + 4.02*x3**2 + 9.15*x0 + 9.81*x1 + 8.4*x3, GRB.MAXIMIZE)

# Add constraints
m.addConstr(7.74*x0 + 6.01*x2 >= 29)
m.addConstr(8.37**2*x2**2 + 1.67**2*x3**2 <= 44)
m.addConstr(3.51*x0 + 0.65*x1 <= 59)
m.addConstr(3.51*x0 + 8.37*x2 <= 104)
m.addConstr(0.65**2*x1**2 + 1.67**2*x3**2 <= 95)
m.addConstr(3.51*x0 + 0.65*x1 + 8.37*x2 <= 65)
m.addConstr(3.51*x0 + 0.65*x1 + 8.37*x2 + 1.67*x3 <= 65)
m.addConstr(5.28**2*x1**2 + 7.08**2*x2**2 <= 59)
m.addConstr(1.79*x0 + 7.08*x2 <= 56)
m.addConstr(1.79*x0 + 5.28*x1 <= 109)
m.addConstr(5.28**2*x1**2 + 7.75**2*x3**2 <= 85)
m.addConstr(1.79*x0 + 5.28*x1 + 7.08*x2 + 7.75*x3 <= 85)
m.addConstr(7.74*x0 + 6.01*x2 <= 140)
m.addConstr(7.74**2*x0**2 + 7.62**2*x3**2 <= 56)
m.addConstr(7.25*x1 + 6.01*x2 <= 105)
m.addConstr(7.74*x0 + 7.25*x1 + 6.01*x2 + 7.62*x3 <= 105)


# Resource Constraints
m.addConstr(3.51*x0 <= 139)
m.addConstr(1.79*x0 <= 203)
m.addConstr(7.74*x0 <= 161)
m.addConstr(0.65*x1 <= 139)
m.addConstr(5.28*x1 <= 203)
m.addConstr(7.25*x1 <= 161)
m.addConstr(8.37*x2 <= 139)
m.addConstr(7.08*x2 <= 203)
m.addConstr(6.01*x2 <= 161)
m.addConstr(1.67*x3 <= 139)
m.addConstr(7.75*x3 <= 203)
m.addConstr(7.62*x3 <= 161)



# 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("The model is infeasible.")
else:
    print("Optimization ended with status:", m.status)

```