## Problem Description and Formulation

The woodshop produces two products: tables and chairs, using two processes: crafting and polishing. The goal is to maximize profit given the constraints on crafting and polishing hours available.

### Decision Variables
- Let \(T\) be the number of tables produced.
- Let \(C\) be the number of chairs produced.

### Objective Function
The profit from selling one table is $1000, and from selling one chair is $300. The objective is to maximize the total profit \(P\):
\[ P = 1000T + 300C \]

### Constraints
1. Crafting hours: Each table requires 5 hours, and each chair requires 2 hours. There are 25 crafting hours available.
\[ 5T + 2C \leq 25 \]

2. Polishing hours: Each table requires 2 hours, and each chair requires 1 hour. There are 15 polishing hours available.
\[ 2T + C \leq 15 \]

3. Non-negativity: The number of tables and chairs cannot be negative.
\[ T \geq 0, C \geq 0 \]

## Gurobi Code

```python
import gurobi

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

    # Define variables
    T = model.addVar(lb=0, name="Tables")
    C = model.addVar(lb=0, name="Chairs")

    # Objective function: Maximize profit
    model.setObjective(1000 * T + 300 * C, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(5 * T + 2 * C <= 25, name="CraftingHours")
    model.addConstr(2 * T + C <= 15, name="PolishingHours")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal profit: ${model.objVal:.2f}")
        print(f"Tables: {T.varValue:.2f}")
        print(f"Chairs: {C.varValue:.2f}")
    else:
        print("No optimal solution found.")

# Run the model
woodshop_production()
```