## Problem Description and Formulation

The problem requires maximizing the objective function: $4 \times \text{hours worked by Jean} + 5 \times \text{hours worked by Laura} + 4 \times \text{hours worked by Mary}$.

The problem involves three variables:
- $x_0$: hours worked by Jean
- $x_1$: hours worked by Laura
- $x_2$: hours worked by Mary

With the following attributes:
- `r0`: work quality rating
  - $x_0$ has a rating of 19
  - $x_1$ has a rating of 8
  - $x_2$ has a rating of 16
  - Upper bound: 93
- `r1`: dollar cost per hour
  - $x_0$ has a cost of 12
  - $x_1$ has a cost of 14
  - $x_2$ has a cost of 2
  - Upper bound: 120

## Constraints

1. $19x_0 + 16x_2 \geq 22$
2. $19x_0 + 8x_1 \geq 30$
3. $8x_1 + 16x_2 \geq 27$
4. $19x_0 + 8x_1 \leq 39$
5. $8x_1 + 16x_2 \leq 91$
6. $19x_0 + 8x_1 + 16x_2 \leq 91$
7. $12x_0 + 2x_2 \leq 90$
8. $12x_0 + 14x_1 \leq 56$
9. $12x_0 + 14x_1 + 2x_2 \leq 56$

## Gurobi Code

```python
import gurobi as gp

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

# Define variables
x0 = m.addVar(name="hours_worked_by_Jean", lb=0)  # hours worked by Jean
x1 = m.addVar(name="hours_worked_by_Laura", lb=0)  # hours worked by Laura
x2 = m.addVar(name="hours_worked_by_Mary", lb=0)  # hours worked by Mary

# Objective function
m.setObjective(4 * x0 + 5 * x1 + 4 * x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(19 * x0 + 16 * x2 >= 22, name="work_quality_rating_Jean_Mary")
m.addConstr(19 * x0 + 8 * x1 >= 30, name="work_quality_rating_Jean_Laura")
m.addConstr(8 * x1 + 16 * x2 >= 27, name="work_quality_rating_Laura_Mary")
m.addConstr(19 * x0 + 8 * x1 <= 39, name="work_quality_rating_Jean_Laura_upper")
m.addConstr(8 * x1 + 16 * x2 <= 91, name="work_quality_rating_Laura_Mary_upper")
m.addConstr(19 * x0 + 8 * x1 + 16 * x2 <= 91, name="work_quality_rating_total_upper")
m.addConstr(12 * x0 + 2 * x2 <= 90, name="dollar_cost_Jean_Mary")
m.addConstr(12 * x0 + 14 * x1 <= 56, name="dollar_cost_Jean_Laura")
m.addConstr(12 * x0 + 14 * x1 + 2 * x2 <= 56, name="dollar_cost_total")

# Optimize the model
m.optimize()

# Print the results
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Hours worked by Jean: {x0.varValue}")
    print(f"Hours worked by Laura: {x1.varValue}")
    print(f"Hours worked by Mary: {x2.varValue}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found.")
```