## Problem Description and Formulation

The butcher shop has 1000 grams of ground meat to make burgers and sausages. The goal is to maximize profit given the following constraints:

- Each burger requires 20 grams of ground meat.
- Each sausage requires 10 grams of ground meat.
- At least three times the number of sausages are needed than burgers.
- There needs to be at least 10 burgers made.
- Each burger is sold for a profit of $5.
- Each sausage is sold for a profit of $3.

## Mathematical Formulation

Let's denote:
- \(B\) as the number of burgers,
- \(S\) as the number of sausages.

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 5B + 3S \]

Subject to:
1. \( 20B + 10S \leq 1000 \) (meat constraint)
2. \( S \geq 3B \) (sausages to burgers ratio)
3. \( B \geq 10 \) (minimum burgers constraint)
4. \( B, S \geq 0 \) and integers (non-negativity and integrality constraint)

## Gurobi Code

```python
import gurobi

def solve_butcher_shop_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    B = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="Burgers")
    S = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="Sausages")

    # Objective function: Maximize profit
    model.setObjective(5 * B + 3 * S, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(20 * B + 10 * S <= 1000, name="Meat_Constraint")
    model.addConstr(S >= 3 * B, name="Sausages_to_Burgers_Ratio")
    model.addConstr(B >= 10, name="Minimum_Burgers")

    # Solve the model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found.")
        print(f"Burgers: {B.varValue}")
        print(f"Sausages: {S.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_butcher_shop_problem()
```