## Problem Description and Formulation

The problem requires maximizing the objective function:

\[ 7.29P + 8.85J + 1.49R \]

where:
- \( P \) is the number of hours worked by Paul,
- \( J \) is the number of hours worked by Jean,
- \( R \) is the number of hours worked by Ringo.

The problem is subject to the following constraints:

1. Paul's productivity rating is 7.
2. Jean's productivity rating is 9.
3. Ringo's productivity rating is 12.
4. \( 7P + 12R \leq 43 \)
5. \( 9J + 12R \leq 37 \)
6. \( 7P + 9J + 12R \leq 93 \)

Additionally, \( P \) and \( J \) must be integers, while \( R \) can be a non-integer.

## Gurobi Code Formulation

```python
import gurobi as gp

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

# Define variables
P = m.addVar(name="hours_worked_by_Paul", lowBound=0, vtype=gp.GRB.INTEGER)
J = m.addVar(name="hours_worked_by_Jean", lowBound=0, vtype=gp.GRB.INTEGER)
R = m.addVar(name="hours_worked_by_Ringo", lowBound=0)

# Objective function
m.setObjective(7.29 * P + 8.85 * J + 1.49 * R, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(7 * P + 12 * R <= 43, name="productivity_constraint_paul_ringo")
m.addConstr(9 * J + 12 * R <= 37, name="productivity_constraint_jean_ringo")
m.addConstr(7 * P + 9 * J + 12 * R <= 93, name="productivity_constraint_all")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Hours worked by Paul: {P.varValue}")
    print(f"Hours worked by Jean: {J.varValue}")
    print(f"Hours worked by Ringo: {R.varValue}")
    print(f"Objective: {m.objVal}")
else:
    print("The model is infeasible or unbounded.")
```