## Step 1: Define the optimization problem and its components
The problem requires maximizing the objective function: $4.89x_0 + 2.71x_1 + 2.84x_2 + 2.81x_3$, where $x_0, x_1, x_2, x_3$ represent the hours worked by Dale, Peggy, George, and Bobby, respectively.

## 2: List all given constraints
- Dale's work quality rating: $1.32x_0$
- Dale's productivity rating: $3.76x_0$
- Peggy's work quality rating: $6.87x_1$
- Peggy's productivity rating: $9.8x_1$
- George's work quality rating: $2.77x_2$
- George's productivity rating: $7.93x_2$
- Bobby's work quality rating: $1.19x_3$
- Bobby's productivity rating: $12.05x_3$

## 3: Translate given constraints into mathematical expressions
1. $2.77x_2 + 1.19x_3 \geq 36$
2. $6.87x_1 + 1.19x_3 \geq 40$
3. $7.93x_2 + 12.05x_3 \geq 14$
4. $3.76x_0 + 9.8x_1 \geq 19$
5. $2.77x_2 + 1.19x_3 \leq 109$
6. $6.87x_1 + 2.77x_2 \leq 70$
7. $6.87x_1 + 2.77x_2 + 1.19x_3 \leq 157$
8. $1.32x_0 + 2.77x_2 + 1.19x_3 \leq 72$
9. $1.32x_0 + 6.87x_1 + 2.77x_2 + 1.19x_3 \leq 72$
10. $7.93x_2 + 12.05x_3 \leq 134$
11. $3.76x_0 + 9.8x_1 \leq 70$
12. $3.76x_0 + 12.05x_3 \leq 113$
13. $9.8x_1 + 12.05x_3 \leq 138$
14. $3.76x_0 + 9.8x_1 + 12.05x_3 \leq 142$
15. $9.8x_1 + 7.93x_2 + 12.05x_3 \leq 84$
16. $3.76x_0 + 9.8x_1 + 7.93x_2 \leq 57$
17. $3.76x_0 + 9.8x_1 + 7.93x_2 + 12.05x_3 \leq 57$

## 4: Define the variables and their constraints
- $x_0, x_1, x_2, x_3$ are integers (since they represent hours worked)

## 5: Implement the problem in Gurobi
```python
import gurobi

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

    # Define the variables
    x0 = model.addVar(name="x0", vtype=gurobi.GRB.INTEGER)  # hours worked by Dale
    x1 = model.addVar(name="x1", vtype=gurobi.GRB.INTEGER)  # hours worked by Peggy
    x2 = model.addVar(name="x2", vtype=gurobi.GRB.INTEGER)  # hours worked by George
    x3 = model.addVar(name="x3", vtype=gurobi.GRB.INTEGER)  # hours worked by Bobby

    # Objective function
    model.setObjective(4.89 * x0 + 2.71 * x1 + 2.84 * x2 + 2.81 * x3, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(2.77 * x2 + 1.19 * x3 >= 36)
    model.addConstr(6.87 * x1 + 1.19 * x3 >= 40)
    model.addConstr(7.93 * x2 + 12.05 * x3 >= 14)
    model.addConstr(3.76 * x0 + 9.8 * x1 >= 19)
    model.addConstr(2.77 * x2 + 1.19 * x3 <= 109)
    model.addConstr(6.87 * x1 + 2.77 * x2 <= 70)
    model.addConstr(6.87 * x1 + 2.77 * x2 + 1.19 * x3 <= 157)
    model.addConstr(1.32 * x0 + 2.77 * x2 + 1.19 * x3 <= 72)
    model.addConstr(1.32 * x0 + 6.87 * x1 + 2.77 * x2 + 1.19 * x3 <= 72)
    model.addConstr(7.93 * x2 + 12.05 * x3 <= 134)
    model.addConstr(3.76 * x0 + 9.8 * x1 <= 70)
    model.addConstr(3.76 * x0 + 12.05 * x3 <= 113)
    model.addConstr(9.8 * x1 + 12.05 * x3 <= 138)
    model.addConstr(3.76 * x0 + 9.8 * x1 + 12.05 * x3 <= 142)
    model.addConstr(9.8 * x1 + 7.93 * x2 + 12.05 * x3 <= 84)
    model.addConstr(3.76 * x0 + 9.8 * x1 + 7.93 * x2 <= 57)
    model.addConstr(3.76 * x0 + 9.8 * x1 + 7.93 * x2 + 12.05 * x3 <= 57)

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Hours worked by Dale: {x0.varValue}")
        print(f"Hours worked by Peggy: {x1.varValue}")
        print(f"Hours worked by George: {x2.varValue}")
        print(f"Hours worked by Bobby: {x3.varValue}")
        print(f"Objective function value: {model.objVal}")
    else:
        print("No optimal solution found.")

optimize_problem()
```