## Problem Description and Formulation

The milk tea store wants to minimize the cost of making milk tea with red bean and pudding toppings. The toppings have specific sugar and butter content, and there are constraints on the number of red bean toppings and the total sugar and butter content.

## Decision Variables

Let $R$ be the number of red bean toppings and $P$ be the number of pudding toppings.

## Objective Function

The objective is to minimize the total cost, which is $1.5R + 2P$.

## Constraints

1. **Red Bean Toppings Limit**: The milk tea can have at most 3 red bean toppings, so $R \leq 3$.
2. **Sugar Content**: The milk tea must have at least 7 grams of sugar, and since each red bean topping contains 1.5 grams of sugar and each pudding topping contains 3 grams of sugar, we have $1.5R + 3P \geq 7$.
3. **Butter Content**: The milk tea must have at least 10 grams of butter, and since each red bean topping contains 2.5 grams of butter and each pudding topping contains 1.2 grams of butter, we have $2.5R + 1.2P \geq 10$.
4. **Non-Negativity**: The number of toppings cannot be negative, so $R \geq 0$ and $P \geq 0$.

## Gurobi Code

```python
import gurobipy as gp

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

# Decision variables
R = model.addVar(lb=0, ub=3, name="Red_Bean_Toppings", vtype=gp.GRB.INTEGER)
P = model.addVar(lb=0, name="Pudding_Toppings", vtype=gp.GRB.INTEGER)

# Objective function: minimize cost
model.setObjective(1.5*R + 2*P, gp.GRB.MINIMIZE)

# Constraints
model.addConstr(R <= 3, name="Red_Bean_Limit")
model.addConstr(1.5*R + 3*P >= 7, name="Sugar_Content")
model.addConstr(2.5*R + 1.2*P >= 10, name="Butter_Content")

# Solve the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: Red Bean Toppings = {R.varValue}, Pudding Toppings = {P.varValue}")
    print(f"Minimum cost: ${model.objVal:.2f}")
else:
    print("The model is infeasible.")
```