## Problem Description and Formulation

The cat shelter needs to feed their cats using two types of food: cat food packets and cans of tuna. The goal is to minimize the cost while meeting the nutritional requirements for carbohydrates, vitamins, and protein.

### Decision Variables

- \(x\): The number of packets of cat food to buy.
- \(y\): The number of cans of tuna to buy.

### Objective Function

The objective is to minimize the total cost. Given that each packet of cat food costs $12 and each can of tuna costs $7, the objective function can be formulated as:

\[ \text{Minimize:} \quad 12x + 7y \]

### Constraints

The cat shelter has specific nutritional requirements:
- Carbohydrates: 700 grams
- Vitamins: 1100 grams
- Protein: 900 grams

And the nutritional content of each food item is:
- Each packet of cat food: 5 grams of carbohydrates, 15 grams of vitamins, 12 grams of protein.
- Each can of tuna: 7 grams of carbohydrates, 12 grams of vitamins, 15 grams of protein.

This translates to the following constraints:

\[ 5x + 7y \geq 700 \] (Carbohydrates requirement)
\[ 15x + 12y \geq 1100 \] (Vitamins requirement)
\[ 12x + 15y \geq 900 \] (Protein requirement)

Additionally, \(x \geq 0\) and \(y \geq 0\) because the shelter cannot buy a negative number of packets or cans.

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    x = model.addVar(name="cat_food_packets", lb=0, vtype=gurobi.GRB.CONTINUOUS)
    y = model.addVar(name="cans_of_tuna", lb=0, vtype=gurobi.GRB.CONTINUOUS)

    # Objective function: Minimize cost
    model.setObjective(12*x + 7*y, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(5*x + 7*y >= 700, name="carbohydrates_requirement")
    model.addConstr(15*x + 12*y >= 1100, name="vitamins_requirement")
    model.addConstr(12*x + 15*y >= 900, name="protein_requirement")

    # Optimize the model
    model.optimize()

    # Print the results
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found. Cost: {model.objVal}")
        print(f"Packets of cat food: {x.varValue}")
        print(f"Cans of tuna: {y.varValue}")
    else:
        print("No optimal solution found.")

solve_cat_shelter_problem()
```