## Problem Description and Formulation

The soup kitchen has 50000 ml of soup to serve. They sell two types of servings: individual servings and family servings. The individual servings have 250 ml of soup, and the family servings have 1200 ml of soup. The kitchen needs to make at least three times the number of individual servings than the family servings and at least 10 family servings. Each individual serving is sold for a profit of $3, and each family serving is sold for a profit of $10. The goal is to maximize profit.

## Decision Variables

- \(x\): Number of individual servings
- \(y\): Number of family servings

## Objective Function

Maximize profit \(P = 3x + 10y\)

## Constraints

1. Total soup used: \(250x + 1200y \leq 50000\)
2. Individual servings vs. family servings: \(x \geq 3y\)
3. Minimum family servings: \(y \geq 10\)
4. Non-negativity: \(x \geq 0, y \geq 0\)

## Gurobi Code

```python
import gurobipy as gp

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

# Decision variables
x = m.addVar(name="individual_servings", lb=0, vtype=gp.GRB.INTEGER)
y = m.addVar(name="family_servings", lb=0, vtype=gp.GRB.INTEGER)

# Objective function: Maximize profit
m.setObjective(3*x + 10*y, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(250*x + 1200*y <= 50000, name="soup_limit")
m.addConstr(x >= 3*y, name="individual_vs_family")
m.addConstr(y >= 10, name="min_family_servings")

# Solve the model
m.solve()

# Output solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution found. Individual servings: {x.varValue}, Family servings: {y.varValue}")
    print(f"Max Profit: {m.objVal}")
else:
    print("No optimal solution found.")
```