## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a bubble tea shop by determining the optimal number of taro and mango bubble teas to produce, given the availability of three ingredients: milk tea, taro, and mango.

Let's define the decision variables:

* `taro_bubble_tea`: the number of taro bubble teas to produce
* `mango_bubble_tea`: the number of mango bubble teas to produce

The objective function is to maximize the profit:

* Profit per taro bubble tea: $4
* Profit per mango bubble tea: $6

The constraints are:

* Availability of taro: 60 units
* Availability of mango: 60 units
* Availability of milk: 140 units
* One taro bubble tea requires 3 units of taro and 4 units of milk
* One mango bubble tea requires 3 units of mango and 5 units of milk

## Mathematical Formulation

The mathematical formulation of the problem is:

Maximize: `4 * taro_bubble_tea + 6 * mango_bubble_tea`

Subject to:

* `3 * taro_bubble_tea <= 60` (taro constraint)
* `3 * mango_bubble_tea <= 60` (mango constraint)
* `4 * taro_bubble_tea + 5 * mango_bubble_tea <= 140` (milk constraint)
* `taro_bubble_tea >= 0` (non-negativity constraint)
* `mango_bubble_tea >= 0` (non-negativity constraint)

## Gurobi Code

```python
import gurobipy as gp

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

# Define the decision variables
taro_bubble_tea = model.addVar(lb=0, name="taro_bubble_tea")
mango_bubble_tea = model.addVar(lb=0, name="mango_bubble_tea")

# Define the objective function
model.setObjective(4 * taro_bubble_tea + 6 * mango_bubble_tea, gp.GRB.MAXIMIZE)

# Define the constraints
model.addConstr(3 * taro_bubble_tea <= 60, name="taro_constraint")
model.addConstr(3 * mango_bubble_tea <= 60, name="mango_constraint")
model.addConstr(4 * taro_bubble_tea + 5 * mango_bubble_tea <= 140, name="milk_constraint")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Taro bubble tea: {taro_bubble_tea.varValue}")
    print(f"Mango bubble tea: {mango_bubble_tea.varValue}")
    print(f"Profit: {model.objVal}")
else:
    print("No optimal solution found.")
```