## Problem Description and Formulation

The museum gift shop has two types of packages: Package 1 and Package 2. Package 1 contains 5 souvenirs and 10 snacks, while Package 2 contains 4 souvenirs and 15 snacks. The shop has a limited supply of 1000 souvenirs and 1400 snacks. The profit per Package 1 is $10, and the profit per Package 2 is $12. The goal is to determine how many of each package the shop should sell to maximize profit.

## Mathematical Formulation

Let \(x_1\) be the number of Package 1 sold and \(x_2\) be the number of Package 2 sold. The objective is to maximize the total profit \(P = 10x_1 + 12x_2\).

The constraints are:
1. Souvenir constraint: \(5x_1 + 4x_2 \leq 1000\)
2. Snack constraint: \(10x_1 + 15x_2 \leq 1400\)
3. Non-negativity constraint: \(x_1 \geq 0, x_2 \geq 0\)

## Gurobi Code

```python
import gurobi

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

    # Define variables
    x1 = model.addVar(lb=0, name="Package_1")
    x2 = model.addVar(lb=0, name="Package_2")

    # Objective function: Maximize profit
    model.setObjective(10*x1 + 12*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(5*x1 + 4*x2 <= 1000, name="souvenir_constraint")
    model.addConstr(10*x1 + 15*x2 <= 1400, name="snack_constraint")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: Package 1 = {x1.varValue}, Package 2 = {x2.varValue}")
        print(f"Max Profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

# Run the optimization
museum_gift_shop_optimization()
```