## Problem Description and Formulation

The problem is an optimization problem where we need to maximize the objective function:

\[ 5 \times \text{hours worked by Laura} + 3 \times \text{hours worked by Paul} + 5 \times \text{hours worked by Jean} + 9 \times \text{hours worked by Dale} \]

subject to several constraints.

## Constraints

1. Laura's organization score is 2.
2. Paul's organization score is 5.
3. Jean's organization score is 5.
4. Dale's organization score is 11.
5. The total combined organization score from hours worked by Jean plus hours worked by Dale must be at least 22.
6. The total combined organization score from hours worked by Laura and hours worked by Dale must be at least 13.
7. The total combined organization score from hours worked by Laura and hours worked by Jean should be at least 17.
8. The total combined organization score from hours worked by Laura, hours worked by Paul, and hours worked by Jean has to be at least 15.
9. The total combined organization score from hours worked by Paul and hours worked by Jean must be at most 51.
10. The total combined organization score from hours worked by Laura and hours worked by Dale should be at most 72.
11. The total combined organization score from hours worked by Laura and hours worked by Paul should be at most 62.
12. The total combined organization score from hours worked by Laura, hours worked by Paul, hours worked by Jean, and hours worked by Dale has to be at most 62.
13. Laura's hours can be non-integer.
14. Paul's hours must be an integer.
15. Jean's hours must be an integer.
16. Dale's hours must be an integer.

## Gurobi Code Formulation

```python
import gurobi as gp

# Define the model
m = gp.Model("optimization_problem")

# Define the variables
laura_hours = m.addVar(name="laura_hours", lb=0, ub=None)  # Non-integer
paul_hours = m.addVar(name="paul_hours", lb=0, ub=None, integrality=gp.GRB.Integer)  # Integer
jean_hours = m.addVar(name="jean_hours", lb=0, ub=None, integrality=gp.GRB.Integer)  # Integer
dale_hours = m.addVar(name="dale_hours", lb=0, ub=None, integrality=gp.GRB.Integer)  # Integer

# Objective function
m.setObjective(5 * laura_hours + 3 * paul_hours + 5 * jean_hours + 9 * dale_hours, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(2 * laura_hours <= 89, name="laura_score")
m.addConstr(5 * paul_hours <= 89, name="paul_score")
m.addConstr(5 * jean_hours <= 89, name="jean_score")
m.addConstr(11 * dale_hours <= 89, name="dale_score")

m.addConstr(5 * jean_hours + 11 * dale_hours >= 22, name="jean_dale_score")
m.addConstr(2 * laura_hours + 11 * dale_hours >= 13, name="laura_dale_score")
m.addConstr(2 * laura_hours + 5 * jean_hours >= 17, name="laura_jean_score")
m.addConstr(2 * laura_hours + 5 * paul_hours + 5 * jean_hours >= 15, name="laura_paul_jean_score")

m.addConstr(5 * paul_hours + 5 * jean_hours <= 51, name="paul_jean_score_max")
m.addConstr(2 * laura_hours + 11 * dale_hours <= 72, name="laura_dale_score_max")
m.addConstr(2 * laura_hours + 5 * paul_hours <= 62, name="laura_paul_score_max")
m.addConstr(2 * laura_hours + 5 * paul_hours + 5 * jean_hours + 11 * dale_hours <= 62, name="all_score_max")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Laura's hours: {laura_hours.varValue}")
    print(f"Paul's hours: {paul_hours.varValue}")
    print(f"Jean's hours: {jean_hours.varValue}")
    print(f"Dale's hours: {dale_hours.varValue}")
    print(f"Objective: {m.objVal}")
else:
    print("No optimal solution found.")
```