## Problem Description and Formulation

The leatherworker has 2000 units of leather to make wallets and purses. The goal is to maximize profit given the following constraints:

- Each wallet needs 2 units of leather.
- Each purse needs 4 units of leather.
- At least four times as many purses are needed than wallets.
- There needs to be at least 10 wallets made.
- The profit per wallet is $40.
- The profit per purse is $85.

## Symbolic Representation

Let's denote:
- \(W\) as the number of wallets to be made.
- \(P\) as the number of purses to be made.

The problem can be formulated as:

### Objective Function
Maximize profit: \(40W + 85P\)

### Constraints
1. Leather constraint: \(2W + 4P \leq 2000\)
2. Purse to wallet ratio: \(P \geq 4W\)
3. Minimum wallets: \(W \geq 10\)
4. Non-negativity: \(W \geq 0, P \geq 0\)

## Gurobi Code

```python
import gurobipy as gp

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

# Define variables
W = m.addVar(name="Wallets", lb=10, vtype=gp.GRB.INTEGER)  # At least 10 wallets
P = m.addVar(name="Purses", vtype=gp.GRB.INTEGER)  # Non-negative

# Objective function: Maximize profit
m.setObjective(40 * W + 85 * P, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(2 * W + 4 * P <= 2000, name="Leather_Constraint")  # Leather limit
m.addConstr(P >= 4 * W, name="Purse_to_Wallet_Ratio")  # Purse to wallet ratio

# Solve the model
m.solve()

# Output solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution: Wallets = {W.varValue}, Purses = {P.varValue}")
    print(f"Max Profit: ${40 * W.varValue + 85 * P.varValue}")
else:
    print("No optimal solution found.")
```