```json
{
  "sym_variables": [
    ("x0", "cornichons"),
    ("x1", "apple pies"),
    ("x2", "strips of bacon"),
    ("x3", "cheeseburgers")
  ],
  "objective_function": "2.18 * x0 + 4.04 * x1 + 4.38 * x2 + 6.25 * x3",
  "constraints": [
    "25 * x1 + 11 * x3 >= 102",
    "5 * x0 + 11 * x3 >= 136",
    "5 * x0 + 26 * x2 >= 98",
    "25 * x1 + 26 * x2 >= 102",
    "5 * x0 + 26 * x2 + 11 * x3 >= 121",
    "32 * x1 + 4 * x3 >= 59",
    "13 * x2 + 4 * x3 >= 46",
    "21 * x0 + 32 * x1 >= 46",
    "21 * x0 + 4 * x3 >= 50",
    "21 * x0 + 13 * x2 + 4 * x3 >= 41",
    "6 * x2 - 9 * x3 >= 0",
    "5 * x0 + 11 * x3 <= 403",
    "25 * x1 + 26 * x2 <= 553",
    "5 * x0 + 25 * x1 <= 377",
    "25 * x1 + 11 * x3 <= 459",
    "26 * x2 + 11 * x3 <= 358",
    "25 * x1 + 26 * x2 + 11 * x3 <= 537",
    "5 * x0 + 25 * x1 + 26 * x2 + 11 * x3 <= 537",
    "21 * x0 + 32 * x1 <= 182",
    "13 * x2 + 4 * x3 <= 218",
    "21 * x0 + 32 * x1 + 13 * x2 + 4 * x3 <= 218"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
cornichons = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="cornichons")
apple_pies = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="apple_pies")
strips_of_bacon = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="strips_of_bacon")
cheeseburgers = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="cheeseburgers")

# Set objective function
m.setObjective(2.18 * cornichons + 4.04 * apple_pies + 4.38 * strips_of_bacon + 6.25 * cheeseburgers, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(25 * apple_pies + 11 * cheeseburgers >= 102, "c1")
m.addConstr(5 * cornichons + 11 * cheeseburgers >= 136, "c2")
m.addConstr(5 * cornichons + 26 * strips_of_bacon >= 98, "c3")
m.addConstr(25 * apple_pies + 26 * strips_of_bacon >= 102, "c4")
m.addConstr(5 * cornichons + 26 * strips_of_bacon + 11 * cheeseburgers >= 121, "c5")
m.addConstr(32 * apple_pies + 4 * cheeseburgers >= 59, "c6")
m.addConstr(13 * strips_of_bacon + 4 * cheeseburgers >= 46, "c7")
m.addConstr(21 * cornichons + 32 * apple_pies >= 46, "c8")
m.addConstr(21 * cornichons + 4 * cheeseburgers >= 50, "c9")
m.addConstr(21 * cornichons + 13 * strips_of_bacon + 4 * cheeseburgers >= 41, "c10")
m.addConstr(6 * strips_of_bacon - 9 * cheeseburgers >= 0, "c11")
m.addConstr(5 * cornichons + 11 * cheeseburgers <= 403, "c12")
m.addConstr(25 * apple_pies + 26 * strips_of_bacon <= 553, "c13")
m.addConstr(5 * cornichons + 25 * apple_pies <= 377, "c14")
m.addConstr(25 * apple_pies + 11 * cheeseburgers <= 459, "c15")
m.addConstr(26 * strips_of_bacon + 11 * cheeseburgers <= 358, "c16")
m.addConstr(25 * apple_pies + 26 * strips_of_bacon + 11 * cheeseburgers <= 537, "c17")
m.addConstr(5 * cornichons + 25 * apple_pies + 26 * strips_of_bacon + 11 * cheeseburgers <= 537, "c18")
m.addConstr(21 * cornichons + 32 * apple_pies <= 182, "c19")
m.addConstr(13 * strips_of_bacon + 4 * cheeseburgers <= 218, "c20")
m.addConstr(21 * cornichons + 32 * apple_pies + 13 * strips_of_bacon + 4 * cheeseburgers <= 218, "c21")


# 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 problem is infeasible.")
else:
    print("The problem could not be solved to optimality.")

```