```json
{
  "sym_variables": [
    ("x0", "hours worked by John"),
    ("x1", "hours worked by Bobby"),
    ("x2", "hours worked by Peggy"),
    ("x3", "hours worked by Ringo")
  ],
  "objective_function": "9.56 * x0 + 4.75 * x1 + 9.42 * x2 + 4.98 * x3",
  "constraints": [
    "1.57 * x1 + 5.68 * x3 >= 45",
    "1.25 * x0 + 1.57 * x1 >= 28",
    "1.57 * x1 + 6.67 * x2 >= 28",
    "7.88 * x0 + 8.32 * x1 + 1.31 * x3 >= 31",
    "7.88 * x0 + 8.32 * x1 + 6.01 * x2 >= 31",
    "8.32 * x1 + 6.01 * x2 + 1.31 * x3 >= 31",
    "7.88 * x0 + 8.32 * x1 + 1.31 * x3 >= 24",
    "7.88 * x0 + 8.32 * x1 + 6.01 * x2 >= 24",
    "8.32 * x1 + 6.01 * x2 + 1.31 * x3 >= 24",
    "5.1 * x0 + 7.48 * x1 >= 41",
    "5.1 * x0 + 0.75 * x3 >= 80",
    "1.25 * x0 + 5.68 * x3 <= 181",
    "1.57 * x1 + 5.68 * x3 <= 118",
    "1.57 * x1 + 6.67 * x2 <= 310",
    "6.67 * x2 + 5.68 * x3 <= 177",
    "1.25 * x0 + 1.57 * x1 + 6.67 * x2 + 5.68 * x3 <= 177",
    "7.88 * x0 + 1.31 * x3 <= 121",
    "6.01 * x2 + 1.31 * x3 <= 43",
    "8.32 * x1 + 1.31 * x3 <= 36",
    "7.88 * x0 + 8.32 * x1 <= 51",
    "7.88 * x0 + 8.32 * x1 + 6.01 * x2 <= 117",
    "7.88 * x0 + 8.32 * x1 + 6.01 * x2 + 1.31 * x3 <= 117",
    "5.1 * x0 + 0.75 * x3 <= 167",
    "0.37 * x2 + 0.75 * x3 <= 327",
    "7.48 * x1 + 0.37 * x2 <= 176",
    "5.1 * x0 + 0.37 * x2 <= 114",
    "7.48 * x1 + 0.75 * x3 <= 326",
    "5.1 * x0 + 7.48 * x1 + 0.37 * x2 + 0.75 * x3 <= 326",
    "x0, x1, x2, x3 are integers",
    "x0 >= 0",
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0"

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
john = m.addVar(vtype=gp.GRB.INTEGER, name="john")
bobby = m.addVar(vtype=gp.GRB.INTEGER, name="bobby")
peggy = m.addVar(vtype=gp.GRB.INTEGER, name="peggy")
ringo = m.addVar(vtype=gp.GRB.INTEGER, name="ringo")


# Set objective function
m.setObjective(9.56 * john + 4.75 * bobby + 9.42 * peggy + 4.98 * ringo, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(1.57 * bobby + 5.68 * ringo >= 45)
m.addConstr(1.25 * john + 1.57 * bobby >= 28)
m.addConstr(1.57 * bobby + 6.67 * peggy >= 28)
m.addConstr(7.88 * john + 8.32 * bobby + 1.31 * ringo >= 31)
m.addConstr(7.88 * john + 8.32 * bobby + 6.01 * peggy >= 31)
m.addConstr(8.32 * bobby + 6.01 * peggy + 1.31 * ringo >= 31)
m.addConstr(7.88 * john + 8.32 * bobby + 1.31 * ringo >= 24)
m.addConstr(7.88 * john + 8.32 * bobby + 6.01 * peggy >= 24)
m.addConstr(8.32 * bobby + 6.01 * peggy + 1.31 * ringo >= 24)
m.addConstr(5.1 * john + 7.48 * bobby >= 41)
m.addConstr(5.1 * john + 0.75 * ringo >= 80)
m.addConstr(1.25 * john + 5.68 * ringo <= 181)
m.addConstr(1.57 * bobby + 5.68 * ringo <= 118)
m.addConstr(1.57 * bobby + 6.67 * peggy <= 310)
m.addConstr(6.67 * peggy + 5.68 * ringo <= 177)
m.addConstr(1.25 * john + 1.57 * bobby + 6.67 * peggy + 5.68 * ringo <= 177)
m.addConstr(7.88 * john + 1.31 * ringo <= 121)
m.addConstr(6.01 * peggy + 1.31 * ringo <= 43)
m.addConstr(8.32 * bobby + 1.31 * ringo <= 36)
m.addConstr(7.88 * john + 8.32 * bobby <= 51)
m.addConstr(7.88 * john + 8.32 * bobby + 6.01 * peggy <= 117)
m.addConstr(7.88 * john + 8.32 * bobby + 6.01 * peggy + 1.31 * ringo <= 117)
m.addConstr(5.1 * john + 0.75 * ringo <= 167)
m.addConstr(0.37 * peggy + 0.75 * ringo <= 327)
m.addConstr(7.48 * bobby + 0.37 * peggy <= 176)
m.addConstr(5.1 * john + 0.37 * peggy <= 114)
m.addConstr(7.48 * bobby + 0.75 * ringo <= 326)
m.addConstr(5.1 * john + 7.48 * bobby + 0.37 * peggy + 0.75 * ringo <= 326)


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print("Optimization ended with status %d" % m.status)

```