```json
{
  "sym_variables": [
    ("x0", "cheeseburgers"),
    ("x1", "cantaloupes"),
    ("x2", "protein bars"),
    ("x3", "blueberry pies")
  ],
  "objective_function": "8.78 * x0 + 9.72 * x1 + 6.84 * x2 + 3.94 * x3",
  "constraints": [
    "1 * x1 + 11 * x2 >= 32",
    "1 * x1 + 12 * x3 >= 36",
    "12 * x0 + 1 * x1 >= 55",
    "12 * x0 + 1 * x1 + 11 * x2 + 12 * x3 >= 55",
    "6 * x0 + 12 * x1 >= 57",
    "8 * x2 + 8 * x3 >= 42",
    "6 * x0 + 8 * x2 >= 29",
    "6 * x0 + 12 * x1 + 8 * x2 >= 54",
    "6 * x0 + 12 * x1 + 8 * x2 + 8 * x3 >= 54",
    "3 * x2 + 16 * x3 >= 20",
    "2 * x1 + 3 * x2 >= 10",
    "2 * x1 + 16 * x3 >= 24",
    "2 * x0 + 2 * x1 + 3 * x2 + 16 * x3 >= 24",
    "-9 * x1 + 10 * x3 >= 0",
    "6 * x0 - 5 * x2 >= 0",
    "-9 * x0 + 7 * x3 >= 0",
    "12 * x0 + 12 * x3 <= 117",
    "11 * x2 + 12 * x3 <= 181",
    "1 * x1 + 11 * x2 + 12 * x3 <= 69",
    "12 * x0 + 1 * x1 + 11 * x2 <= 64",
    "6 * x0 + 12 * x1 + 8 * x2 <= 230",
    "2 * x0 + 3 * x2 <= 82",
    "3 * x2 + 16 * x3 <= 39",
    "12 * x0 + 1 * x1 + 11 * x2 + 12 * x3 <= 249",  // Resource constraint: dollar cost
    "6 * x0 + 12 * x1 + 8 * x2 + 8 * x3 <= 231",  // Resource constraint: grams of fat
    "2 * x0 + 2 * x1 + 3 * x2 + 16 * x3 <= 98"   // Resource constraint: grams of protein

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
cheeseburgers = m.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name="cheeseburgers")
cantaloupes = m.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name="cantaloupes")
protein_bars = m.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name="protein_bars")
blueberry_pies = m.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name="blueberry_pies")


# Set objective function
m.setObjective(8.78 * cheeseburgers + 9.72 * cantaloupes + 6.84 * protein_bars + 3.94 * blueberry_pies, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(1 * cantaloupes + 11 * protein_bars >= 32)
m.addConstr(1 * cantaloupes + 12 * blueberry_pies >= 36)
m.addConstr(12 * cheeseburgers + 1 * cantaloupes >= 55)
m.addConstr(12 * cheeseburgers + 1 * cantaloupes + 11 * protein_bars + 12 * blueberry_pies >= 55)
m.addConstr(6 * cheeseburgers + 12 * cantaloupes >= 57)
m.addConstr(8 * protein_bars + 8 * blueberry_pies >= 42)
m.addConstr(6 * cheeseburgers + 8 * protein_bars >= 29)
m.addConstr(6 * cheeseburgers + 12 * cantaloupes + 8 * protein_bars >= 54)
m.addConstr(6 * cheeseburgers + 12 * cantaloupes + 8 * protein_bars + 8 * blueberry_pies >= 54)
m.addConstr(3 * protein_bars + 16 * blueberry_pies >= 20)
m.addConstr(2 * cantaloupes + 3 * protein_bars >= 10)
m.addConstr(2 * cantaloupes + 16 * blueberry_pies >= 24)
m.addConstr(2 * cheeseburgers + 2 * cantaloupes + 3 * protein_bars + 16 * blueberry_pies >= 24)
m.addConstr(-9 * cantaloupes + 10 * blueberry_pies >= 0)
m.addConstr(6 * cheeseburgers - 5 * protein_bars >= 0)
m.addConstr(-9 * cheeseburgers + 7 * blueberry_pies >= 0)
m.addConstr(12 * cheeseburgers + 12 * blueberry_pies <= 117)
m.addConstr(11 * protein_bars + 12 * blueberry_pies <= 181)
m.addConstr(1 * cantaloupes + 11 * protein_bars + 12 * blueberry_pies <= 69)
m.addConstr(12 * cheeseburgers + 1 * cantaloupes + 11 * protein_bars <= 64)
m.addConstr(6 * cheeseburgers + 12 * cantaloupes + 8 * protein_bars <= 230)
m.addConstr(2 * cheeseburgers + 3 * protein_bars <= 82)
m.addConstr(3 * protein_bars + 16 * blueberry_pies <= 39)

# Resource constraints
m.addConstr(12 * cheeseburgers + 1 * cantaloupes + 11 * protein_bars + 12 * blueberry_pies <= 249)
m.addConstr(6 * cheeseburgers + 12 * cantaloupes + 8 * protein_bars + 8 * blueberry_pies <= 231)
m.addConstr(2 * cheeseburgers + 2 * cantaloupes + 3 * protein_bars + 16 * blueberry_pies <= 98)


# 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('Optimization problem is infeasible.')
else:
    print('Optimization ended with status %d' % m.status)

```