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

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

# Create variables
variables = ['protein bars', 'granola bars', 'steaks', 'chicken breasts', 'strawberries', 'tomatoes', 'sashimi', 'cornichons']
x = m.addVars(len(variables), lb=0, name=variables)

# Set integer constraints
for i in [0, 1, 2, 4, 5, 7]:
    x[i].vtype = GRB.INTEGER

# Objective function
objective = 9.88 * x[0] + 7.24 * x[1] + 7.18 * x[2] + 1.72 * x[3] + 8.03 * x[4] + 4.13 * x[5] + 1.4 * x[6] + 4.16 * x[7]
m.setObjective(objective, GRB.MINIMIZE)

# Resource constraints
resources = {
    'r0': {'description': 'grams of protein', 'upper_bound': 94, 'coefficients': [1, 1, 3, 5, 5, 7, 1, 8]},
    'r1': {'description': 'tastiness rating', 'upper_bound': 272, 'coefficients': [8, 8, 2, 2, 5, 7, 4, 4]}
}

for resource, data in resources.items():
    m.addConstr(
        gp.quicksum(data['coefficients'][i] * x[i] for i in range(len(variables))) <= data['upper_bound'],
        name=resource
    )

# Additional constraints
m.addConstr(5 * x[3] + 5 * x[4] >= 9, "c1")
m.addConstr(1 * x[0] + 3 * x[2] >= 6, "c2")
m.addConstr(7 * x[5] + 8 * x[7] >= 7, "c3")
m.addConstr(1 * x[0] + 8 * x[7] >= 11, "c4")
m.addConstr(5 * x[4] + 1 * x[6] >= 8, "c5")
m.addConstr(1 * x[1] + 8 * x[7] >= 5, "c6")
m.addConstr(7 * x[5] + 1 * x[6] >= 7, "c7")
m.addConstr(1 * x[1] + 3 * x[2] >= 6, "c8")
m.addConstr(1 * x[0] + 1 * x[1] >= 5, "c9")
m.addConstr(1 * x[1] + 7 * x[5] >= 8, "c10")
m.addConstr(3 * x[2] + 8 * x[7] >= 7, "c11")
m.addConstr(1 * x[1] + 5 * x[4] >= 7, "c12")
m.addConstr(1 * x[1] + 5 * x[3] >= 4, "c13")
m.addConstr(1 * x[1] + 1 * x[6] >= 10, "c14")
m.addConstr(1 * x[0] + 1 * x[6] >= 7, "c15")
m.addConstr(5 * x[3] + 8 * x[7] >= 3, "c16")
m.addConstr(5 * x[3] + 1 * x[6] >= 6, "c17")
m.addConstr(5 * x[3] + 7 * x[5] >= 6, "c18")
m.addConstr(x.sum() >= 6, "c19")


# ... (Rest of the constraints, following the same pattern)


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