## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a salad shop by determining the optimal number of large and small salads to produce, given the available amounts of lettuce and sauce.

Let's define the decision variables:

* `L`: the number of large salads to produce
* `S`: the number of small salads to produce

The objective function is to maximize the profit:

* Profit per large salad: $4
* Profit per small salad: $2

The constraints are:

* Lettuce availability: 1500 g
* Sauce availability: 1200 g
* Lettuce usage: 45 g per large salad, 30 g per small salad
* Sauce usage: 10 g per large salad, 7 g per small salad

## Mathematical Formulation

The mathematical formulation of the problem is:

Maximize: `4L + 2S`

Subject to:

* `45L + 30S <= 1500` (lettuce constraint)
* `10L + 7S <= 1200` (sauce constraint)
* `L >= 0` and `S >= 0` (non-negativity constraints)

## Gurobi Code

```python
import gurobi

# Create a new Gurobi model
m = gurobi.Model()

# Define the decision variables
L = m.addVar(name="Large_Salads", lb=0, ub=None, obj=4)
S = m.addVar(name="Small_Salads", lb=0, ub=None, obj=2)

# Define the constraints
m.addConstr(L * 45 + S * 30 <= 1500, name="Lettuce_Constraint")
m.addConstr(L * 10 + S * 7 <= 1200, name="Sauce_Constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == gurobi.GRB.Status.OPTIMAL:
    print("Optimal solution found.")
    print(f"Large Salads: {L.varValue}")
    print(f"Small Salads: {S.varValue}")
    print(f"Max Profit: {m.objVal}")
else:
    print("No optimal solution found.")
```

This code defines the decision variables `L` and `S`, the objective function, and the constraints. It then optimizes the model using Gurobi's solver and prints the optimal solution, including the number of large and small salads to produce and the maximum profit. If no optimal solution is found, it prints a message indicating that.