## Problem Description and Formulation

The problem is an optimization problem that involves maximizing an objective function subject to several constraints. The objective function is to maximize \(7.89 \times \text{oranges} + 1.44 \times \text{kiwis} + 4.36 \times \text{bananas}\).

The constraints are as follows:
- Each orange contains 6 grams of fat and costs $9.
- Each kiwi contains 6 grams of fat and costs $12.
- Each banana contains 6 grams of fat and costs $8.
- At least 34 grams of fat must come from oranges and kiwis.
- At least 17 grams of fat must come from kiwis and bananas.
- At least 31 grams of fat must come from oranges and bananas.
- \(5 \times \text{oranges} - 10 \times \text{kiwis} \geq 0\).
- No more than 98 grams of fat can come from oranges and bananas.
- No more than 62 grams of fat can come from oranges and kiwis.
- No more than 92 grams of fat can come from kiwis and bananas.
- No more than 49 grams of fat can come from oranges, kiwis, and bananas.
- The total cost for kiwis and bananas cannot exceed $90.
- The total cost for oranges and kiwis cannot exceed $85.
- The total cost for oranges, kiwis, and bananas cannot exceed $85.
- The number of oranges, kiwis, and bananas must be integers.

## Gurobi Code Formulation

```python
import gurobipy as gp

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

# Define the variables
oranges = m.addVar(name="oranges", vtype=gp.GRB.INTEGER)
kiwis = m.addVar(name="kiwis", vtype=gp.GRB.INTEGER)
bananas = m.addVar(name="bananas", vtype=gp.GRB.INTEGER)

# Objective function
m.setObjective(7.89 * oranges + 1.44 * kiwis + 4.36 * bananas, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(6 * oranges + 6 * kiwis >= 34, name="fat_oranges_kiwis")
m.addConstr(6 * kiwis + 6 * bananas >= 17, name="fat_kiwis_bananas")
m.addConstr(6 * oranges + 6 * bananas >= 31, name="fat_oranges_bananas")
m.addConstr(5 * oranges - 10 * kiwis >= 0, name="oranges_kiwis_ratio")
m.addConstr(6 * oranges + 6 * bananas <= 98, name="fat_oranges_bananas_limit")
m.addConstr(6 * oranges + 6 * kiwis <= 62, name="fat_oranges_kiwis_limit")
m.addConstr(6 * kiwis + 6 * bananas <= 92, name="fat_kiwis_bananas_limit")
m.addConstr(6 * oranges + 6 * kiwis + 6 * bananas <= 49, name="fat_total_limit")
m.addConstr(6 * oranges + 6 * kiwis + 6 * bananas <= 49, name="fat_total_limit_redundant")
m.addConstr(12 * kiwis + 8 * bananas <= 90, name="cost_kiwis_bananas")
m.addConstr(9 * oranges + 12 * kiwis <= 85, name="cost_oranges_kiwis")
m.addConstr(9 * oranges + 12 * kiwis + 8 * bananas <= 85, name="cost_total")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Oranges: {oranges.varValue}")
    print(f"Kiwis: {kiwis.varValue}")
    print(f"Bananas: {bananas.varValue}")
    print(f"Objective: {m.objVal}")
else:
    print("No optimal solution found")
```