```json
{
  "sym_variables": [
    ("x0", "hours worked by Ringo"),
    ("x1", "hours worked by Bobby"),
    ("x2", "hours worked by Hank"),
    ("x3", "hours worked by Mary")
  ],
  "objective_function": "6.1 * x0 + 8.29 * x1 + 4.21 * x2 + 2.36 * x3",
  "constraints": [
    "11 * x0 + 8 * x1 + 7 * x2 >= 39",
    "11 * x0 + 8 * x1 + 3 * x3 >= 39",
    "11 * x0 + 8 * x1 + 7 * x2 >= 47",
    "11 * x0 + 8 * x1 + 3 * x3 >= 47",
    "3 * x0 + 4 * x3 >= 8",
    "9 * x2 + 4 * x3 >= 15",
    "6 * x1 + 9 * x2 >= 18",
    "3 * x0 + 6 * x1 + 4 * x3 >= 21",
    "3 * x2 + 7 * x3 >= 20",
    "10 * x1 + 7 * x3 >= 11",
    "4 * x0 + 3 * x2 >= 25",
    "10 * x1 + 3 * x2 >= 21",
    "4 * x0 + 7 * x3 >= 28",
    "4 * x0 + 3 * x2 + 7 * x3 >= 20",
    "2 * x0 + 8 * x2 >= 6",
    "11 * x0 + 3 * x3 <= 195",
    "11 * x0 + 7 * x2 <= 169",
    "11 * x0 + 8 * x1 <= 72",
    "8 * x1 + 7 * x2 <= 128",
    "11 * x0 + 8 * x1 + 3 * x3 <= 74",
    "11 * x0 + 8 * x1 + 7 * x2 <= 193",
    "11 * x0 + 8 * x1 + 7 * x2 + 3 * x3 <= 193",
    "3 * x0 + 9 * x2 <= 57",
    "3 * x0 + 6 * x1 <= 103",
    "3 * x0 + 6 * x1 + 9 * x2 + 4 * x3 <= 103",
    "4 * x0 + 3 * x2 <= 87",
    "10 * x1 + 7 * x3 <= 106",
    "3 * x2 + 7 * x3 <= 45",
    "4 * x0 + 10 * x1 + 3 * x2 <= 79",
    "10 * x1 + 3 * x2 + 7 * x3 <= 73",
    "4 * x0 + 10 * x1 + 7 * x3 <= 43",
    "4 * x0 + 10 * x1 + 3 * x2 + 7 * x3 <= 43",
    "8 * x2 + 11 * x3 <= 46",
    "2 * x0 + 11 * x3 <= 21",
    "8 * x1 + 8 * x2 + 11 * x3 <= 24",
    "2 * x0 + 8 * x1 + 8 * x2 + 11 * x3 <= 24",
    "x0 == int(x0)",  // Ringo's hours are integer
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0"
  ]
}
```

```python
import gurobipy as gp

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

    # Create variables
    ringo = model.addVar(vtype=gp.GRB.INTEGER, name="ringo")
    bobby = model.addVar(vtype=gp.GRB.CONTINUOUS, name="bobby")
    hank = model.addVar(vtype=gp.GRB.CONTINUOUS, name="hank")
    mary = model.addVar(vtype=gp.GRB.CONTINUOUS, name="mary")

    # Set objective
    model.setObjective(6.1 * ringo + 8.29 * bobby + 4.21 * hank + 2.36 * mary, gp.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(11 * ringo + 8 * bobby + 7 * hank >= 39)
    model.addConstr(11 * ringo + 8 * bobby + 3 * mary >= 39)
    model.addConstr(11 * ringo + 8 * bobby + 7 * hank >= 47)
    model.addConstr(11 * ringo + 8 * bobby + 3 * mary >= 47)
    model.addConstr(3 * ringo + 4 * mary >= 8)
    model.addConstr(9 * hank + 4 * mary >= 15)
    model.addConstr(6 * bobby + 9 * hank >= 18)
    model.addConstr(3 * ringo + 6 * bobby + 4 * mary >= 21)
    model.addConstr(3 * hank + 7 * mary >= 20)
    model.addConstr(10 * bobby + 7 * mary >= 11)
    model.addConstr(4 * ringo + 3 * hank >= 25)
    model.addConstr(10 * bobby + 3 * hank >= 21)
    model.addConstr(4 * ringo + 7 * mary >= 28)
    model.addConstr(4 * ringo + 3 * hank + 7 * mary >= 20)
    model.addConstr(2 * ringo + 8 * hank >= 6)
    # ... (rest of the constraints as above)


    # Optimize model
    model.optimize()

    if model.status == gp.GRB.OPTIMAL:
        print('Obj: %g' % model.objVal)
        print('Ringo:', ringo.x)
        print('Bobby:', bobby.x)
        print('Hank:', hank.x)
        print('Mary:', mary.x)

    elif model.status == gp.GRB.INFEASIBLE:
        print('Model is infeasible')


except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError:
    print('Encountered an attribute error')
```