## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The landscaper has three types of layouts (A, B, and C) with different requirements for rock, mulch, and grass. The goal is to maximize profit given the constraints on the available resources.

Let's define the decision variables:
- $x_A$ = number of type A layouts
- $x_B$ = number of type B layouts
- $x_C$ = number of type C layouts

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 200x_A + 175x_B + 225x_C \]

The constraints based on the available resources are:
\[ \text{Subject to:} \quad \begin{align*}
10x_A + 5x_B + 12x_C &\leq 1200 \quad \text{(rock constraint)} \\
7x_A + 12x_B + 4x_C &\leq 700 \quad \text{(mulch constraint)} \\
15x_A + 10x_B + 12x_C &\leq 2000 \quad \text{(grass constraint)} \\
x_A, x_B, x_C &\geq 0 \quad \text{(non-negativity constraint)}
\end{align*} \]

## Gurobi Code

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Landscaper_Problem")

# Define the decision variables
x_A = model.addVar(lb=0, name="x_A")  # number of type A layouts
x_B = model.addVar(lb=0, name="x_B")  # number of type B layouts
x_C = model.addVar(lb=0, name="x_C")  # number of type C layouts

# Define the objective function
model.setObjective(200 * x_A + 175 * x_B + 225 * x_C, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(10 * x_A + 5 * x_B + 12 * x_C <= 1200, name="rock_constraint")
model.addConstr(7 * x_A + 12 * x_B + 4 * x_C <= 700, name="mulch_constraint")
model.addConstr(15 * x_A + 10 * x_B + 12 * x_C <= 2000, name="grass_constraint")

# Solve the model
model.optimize()

# Check if the model is optimized
if model.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Type A layouts: {x_A.varValue}")
    print(f"Type B layouts: {x_B.varValue}")
    print(f"Type C layouts: {x_C.varValue}")
    print(f"Max Profit: ${model.objVal:.2f}")
else:
    print("The model is infeasible or unbounded.")
```