## Problem Description and Formulation

The problem is a classic example of a linear programming (LP) problem. The wood shop wants to maximize its profit by producing cutting boards and knife handles under certain constraints.

### Decision Variables

Let $x$ be the number of cutting boards produced and $y$ be the number of knife handles produced.

### Objective Function

The profit on a cutting board is $100, and the profit on a knife handle is $250. The objective is to maximize the total profit:

Maximize: $100x + 250y$

### Constraints

1. **Production Limits**: The wood shop can make a maximum of 30 cutting boards and 50 knife handles in a week.
   - $x \leq 30$
   - $y \leq 50$

2. **Time Constraint**: It takes a worker 5 hours to make a cutting board and 10 hours to make a knife handle. The total number of hours by all employees is at most 200 hours per week.
   - $5x + 10y \leq 200$

3. **Non-Negativity Constraints**: The number of cutting boards and knife handles produced cannot be negative.
   - $x \geq 0$
   - $y \geq 0$

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    x = model.addVar(lb=0, ub=30, name="cutting_boards")
    y = model.addVar(lb=0, ub=50, name="knife_handles")

    # Objective function: Maximize profit
    model.setObjective(100*x + 250*y, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(x <= 30, name="cutting_boards_limit")
    model.addConstr(y <= 50, name="knife_handles_limit")
    model.addConstr(5*x + 10*y <= 200, name="time_limit")

    # Optimize the model
    model.optimize()

    # Print the results
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Cutting Boards: {x.varValue}")
        print(f"Knife Handles: {y.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("The model is infeasible")

# Run the optimization
wood_shop_optimization()
```