## Problem Description and Formulation

The grocery store wants to maximize profit by selling bulk quantities of gummy bears, gummy worms, and sour candies through special combo deals. There are two types of combos: Combo 1 and Combo 2, each with a specific quantity of gummy bears, gummy worms, and sour candies. The store has limited quantities of each candy: 1200 grams of gummy bears, 1400 grams of gummy worms, and 900 grams of sour candies. The profit per Combo 1 is $4, and the profit per Combo 2 is $4.50.

## Decision Variables

Let \(x_1\) be the number of Combo 1 to sell and \(x_2\) be the number of Combo 2 to sell.

## Objective Function

The objective is to maximize profit: \(4x_1 + 4.5x_2\).

## Constraints

1. **Gummy Bears Constraint**: \(25x_1 + 12x_2 \leq 1200\)
2. **Gummy Worms Constraint**: \(20x_1 + 21x_2 \leq 1400\)
3. **Sour Candies Constraint**: \(15x_1 + 24x_2 \leq 900\)
4. **Non-Negativity Constraints**: \(x_1 \geq 0, x_2 \geq 0\)

## Gurobi Code

```python
import gurobipy as gp

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

# Define decision variables
x1 = m.addVar(name="Combo_1", lb=0, vtype=gp.GRB.CONTINUOUS)
x2 = m.addVar(name="Combo_2", lb=0, vtype=gp.GRB.CONTINUOUS)

# Objective function: Maximize profit
m.setObjective(4 * x1 + 4.5 * x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(25 * x1 + 12 * x2 <= 1200, name="Gummy_Bears_Constraint")
m.addConstr(20 * x1 + 21 * x2 <= 1400, name="Gummy_Worms_Constraint")
m.addConstr(15 * x1 + 24 * x2 <= 900, name="Sour_Candies_Constraint")

# Solve the model
m.solve()

# Output the solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution: Combo 1 = {x1.varValue}, Combo 2 = {x2.varValue}")
    print(f"Maximum Profit: ${m.objVal:.2f}")
else:
    print("The model is infeasible.")
```