## Problem Description and Formulation

The company sells two types of products: almond tins and cashew tins. The production of these tins involves two processes: filling and labeling. Each almond tin requires 5 minutes for filling and 3 minutes for labeling. Each cashew tin requires 4 minutes for filling and 5 minutes for labeling. The company has a limited amount of time available for each process: 400 minutes for filling and 500 minutes for labeling. The profit per almond tin is $10, and the profit per cashew tin is $15. The goal is to determine how many of each type of tin the company should produce to maximize profit.

## Mathematical Formulation

Let's denote the number of almond tins as \(A\) and the number of cashew tins as \(C\). The problem can be formulated as a linear programming problem:

- **Objective Function (Maximize Profit):** \(10A + 15C\)
- **Constraints:**
  1. Filling time constraint: \(5A + 4C \leq 400\)
  2. Labeling time constraint: \(3A + 5C \leq 500\)
  3. Non-negativity constraints: \(A \geq 0, C \geq 0\)

## Gurobi Code

```python
import gurobi

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

    # Define variables
    A = model.addVar(lb=0, name="Almond_Tins")  # Number of almond tins
    C = model.addVar(lb=0, name="Cashew_Tins")  # Number of cashew tins

    # Objective function: Maximize profit
    model.setObjective(10*A + 15*C, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(5*A + 4*C <= 400, name="Filling_Time_Constraint")
    model.addConstr(3*A + 5*C <= 500, name="Labeling_Time_Constraint")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution:")
        print(f"Almond Tins: {A.varValue}")
        print(f"Cashew Tins: {C.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

if __name__ == "__main__":
    solve_optimization_problem()
```