## Step 1: Define the optimization problem
The problem is to maximize the objective function: $8x_0 + 9x_1 + 4x_2$, where $x_0$, $x_1$, and $x_2$ represent the hours worked by Bill, Peggy, and Jean, respectively.

## Step 2: List all the constraints
The constraints are:
- $12x_0 \leq 186$
- $20x_0 \leq 296$
- $18x_0 \leq 160$
- $16x_1 \leq 186$
- $16x_1 \leq 296$
- $11x_1 \leq 160$
- $5x_2 \leq 186$
- $12x_2 \leq 296$
- $2x_2 \leq 160$
- $16x_1 + 5x_2 \geq 51$
- $12x_0 + 5x_2 \geq 24$
- $20x_0 + 12x_2 \geq 34$
- $16x_1 + 12x_2 \geq 96$
- $18x_0 + 2x_2 \geq 42$
- $18x_0 + 11x_1 + 2x_2 \geq 37$
- $16x_1 + 5x_2 \leq 118$
- $12x_0 + 5x_2 \leq 163$
- $12x_0 + 16x_1 + 5x_2 \leq 125$
- $20x_0 + 12x_2 \leq 194$
- $20x_0 + 16x_1 + 12x_2 \leq 194$
- $11x_1 + 2x_2 \leq 134$
- $18x_0 + 11x_1 \leq 64$
- $18x_0 + 11x_1 + 2x_2 \leq 64$
- $x_0, x_1, x_2 \geq 0$

## 3: Convert the problem into Gurobi code
We will use the Gurobi Python API to model and solve this problem.

```python
import gurobi as gp

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

# Define the variables
x0 = m.addVar(name="hours_worked_by_Bill", lb=0)
x1 = m.addVar(name="hours_worked_by_Peggy", lb=0)
x2 = m.addVar(name="hours_worked_by_Jean", lb=0)

# Define the objective function
m.setObjective(8*x0 + 9*x1 + 4*x2, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(12*x0 <= 186)
m.addConstr(20*x0 <= 296)
m.addConstr(18*x0 <= 160)
m.addConstr(16*x1 <= 186)
m.addConstr(16*x1 <= 296)
m.addConstr(11*x1 <= 160)
m.addConstr(5*x2 <= 186)
m.addConstr(12*x2 <= 296)
m.addConstr(2*x2 <= 160)
m.addConstr(16*x1 + 5*x2 >= 51)
m.addConstr(12*x0 + 5*x2 >= 24)
m.addConstr(20*x0 + 12*x2 >= 34)
m.addConstr(16*x1 + 12*x2 >= 96)
m.addConstr(18*x0 + 2*x2 >= 42)
m.addConstr(18*x0 + 11*x1 + 2*x2 >= 37)
m.addConstr(16*x1 + 5*x2 <= 118)
m.addConstr(12*x0 + 5*x2 <= 163)
m.addConstr(12*x0 + 16*x1 + 5*x2 <= 125)
m.addConstr(20*x0 + 12*x2 <= 194)
m.addConstr(20*x0 + 16*x1 + 12*x2 <= 194)
m.addConstr(11*x1 + 2*x2 <= 134)
m.addConstr(18*x0 + 11*x1 <= 64)
m.addConstr(18*x0 + 11*x1 + 2*x2 <= 64)

# Optimize the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Objective: ", m.objVal)
    print("Hours worked by Bill: ", x0.varValue)
    print("Hours worked by Peggy: ", x1.varValue)
    print("Hours worked by Jean: ", x2.varValue)
else:
    print("The problem is infeasible")
```