## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The wood shop aims to maximize its profit by producing the optimal number of canoes and paddles given the constraints on cutting, woodworking, and sanding times.

Let's define the decision variables:
- \(C\): The number of canoes to be produced.
- \(P\): The number of paddles to be produced.

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 500C + 75P \]

Subject to the constraints:
1. Cutting time: \( 1C + 0.5P \leq 80 \)
2. Woodworking time: \( 5C + 1P \leq 100 \)
3. Sanding time: \( 2C + 0.75P \leq 70 \)
4. Non-negativity: \( C \geq 0, P \geq 0 \)

## Gurobi Code

To solve this problem using Gurobi in Python, we will first install the Gurobi library if it's not already installed. You can install it using pip:

```bash
pip install gurobi
```

Now, let's formulate and solve the problem using Gurobi:

```python
import gurobi as gp

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

# Define the decision variables
C = model.addVar(name="Canoes", lb=0, vtype=gp.GRB.CONTINUOUS)
P = model.addVar(name="Paddles", lb=0, vtype=gp.GRB.CONTINUOUS)

# Define the objective function
model.setObjective(500*C + 75*P, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(1*C + 0.5*P <= 80, name="Cutting_Time")
model.addConstr(5*C + 1*P <= 100, name="Woodworking_Time")
model.addConstr(2*C + 0.75*P <= 70, name="Sanding_Time")

# Optimize the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution found. Number of canoes: {C.varValue}, Number of paddles: {P.varValue}")
    print(f"Maximum profit: ${500*C.varValue + 75*P.varValue:.2f}")
else:
    print("No optimal solution found.")
```