## Problem Description and Formulation

The wood artist wants to maximize his profit by producing cutting boards and chairs. The problem can be formulated as a linear programming problem. Let's define the decision variables:

- \(x\): the number of cutting boards to produce
- \(y\): the number of chairs to produce

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 14x + 25y \]

Subject to the constraints:
1. Time constraint: \( 30x + 70y \leq 1500 \) (total time used does not exceed 1500 minutes)
2. Material constraint: \( x + y \leq 40 \) (total items do not exceed 40)
3. Non-negativity constraint: \( x \geq 0, y \geq 0 \) (number of items cannot be negative)

## Gurobi Code

To solve this problem using Gurobi in Python, we will use the Gurobi Python interface. First, ensure you have Gurobi installed and a valid license.

```python
import gurobi as gp

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

# Define the decision variables
x = model.addVar(lb=0, name="cutting_boards")  # Number of cutting boards
y = model.addVar(lb=0, name="chairs")  # Number of chairs

# Objective function: Maximize profit
model.setObjective(14 * x + 25 * y, gp.GRB.MAXIMIZE)

# Time constraint: 30x + 70y <= 1500
model.addConstr(30 * x + 70 * y <= 1500, name="time_constraint")

# Material constraint: x + y <= 40
model.addConstr(x + y <= 40, name="material_constraint")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution found. Profit: ${model.objVal}")
    print(f"Cutting boards to make: {x.varValue}")
    print(f"Chairs to make: {y.varValue}")
else:
    print("No optimal solution found.")
```