```json
{
  "sym_variables": [
    ("x0", "hours worked by Mary"),
    ("x1", "hours worked by Dale"),
    ("x2", "hours worked by Paul"),
    ("x3", "hours worked by Laura"),
    ("x4", "hours worked by Bobby")
  ],
  "objective_function": "4*x0 + 4*x1 + 7*x2 + 5*x3 + 1*x4",
  "constraints": [
    "18*x1 + 11*x4 >= 39",
    "19*x0 + 4*x3 >= 44",
    "19*x0 + 11*x4 >= 94",
    "19*x0 + 18*x1 + 9*x2 >= 107",
    "19*x0 + 18*x1 + 9*x2 + 4*x3 + 11*x4 >= 107",
    "15*x3 + 4*x4 >= 113",
    "22*x0 + 4*x4 >= 86",
    "16*x2 + 4*x4 >= 86",
    "24*x1 + 16*x2 + 4*x4 >= 87",
    "22*x0 + 24*x1 + 15*x3 >= 87",
    "24*x1 + 15*x3 + 4*x4 >= 87",
    "24*x1 + 16*x2 + 4*x4 >= 94",
    "22*x0 + 24*x1 + 15*x3 >= 94",
    "24*x1 + 15*x3 + 4*x4 >= 94",
    "24*x1 + 16*x2 + 4*x4 >= 77",
    "22*x0 + 24*x1 + 15*x3 >= 77",
    "24*x1 + 15*x3 + 4*x4 >= 77",
    "22*x0 + 24*x1 + 16*x2 + 15*x3 + 4*x4 >= 77",
    "2*x3 + 6*x4 >= 51",
    "10*x0 + 6*x4 >= 51",
    "10*x0 + 7*x1 >= 96",
    "7*x1 + 7*x2 >= 79",
    "7*x1 + 2*x3 >= 52",
    "10*x0 + 7*x2 >= 96",
    "7*x2 + 6*x4 >= 108",
    "10*x0 + 7*x1 + 7*x2 + 2*x3 + 6*x4 >= 108",
    "6*x1 - 6*x4 >= 0",
    "-2*x0 + 3*x2 >= 0",
    "18*x1 + 9*x2 <= 523",
    "19*x0 + 18*x1 + 4*x3 <= 355",
    "19*x0 + 18*x1 + 9*x2 <= 354",
    "16*x2 + 4*x4 <= 213",
    "24*x1 + 4*x4 <= 284",
    "24*x1 + 16*x2 <= 478",
    "15*x3 + 4*x4 <= 202",
    "22*x0 + 4*x4 <= 392",
    "24*x1 + 15*x3 <= 249",
    "16*x2 + 15*x3 + 4*x4 <= 215",
    "22*x0 + 15*x3 + 4*x4 <= 483",
    "22*x0 + 24*x1 + 16*x2 <= 321",
    "24*x1 + 16*x2 + 15*x3 <= 349",
    "22*x0 + 24*x1 + 15*x3 <= 221",
    "7*x1 + 2*x3 <= 582",
    "7*x2 + 2*x3 <= 183",
    "10*x0 + 7*x2 <= 325",
    "7*x2 + 6*x4 <= 450",
    "2*x3 + 6*x4 <= 406",
    "7*x1 + 6*x4 <= 299"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
mary = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Mary")
dale = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Dale")
paul = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Paul")
laura = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Laura")
bobby = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Bobby")


# Set objective function
m.setObjective(4 * mary + 4 * dale + 7 * paul + 5 * laura + 1 * bobby, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(18 * dale + 11 * bobby >= 39)
m.addConstr(19 * mary + 4 * laura >= 44)
m.addConstr(19 * mary + 11 * bobby >= 94)
m.addConstr(19 * mary + 18 * dale + 9 * paul >= 107)
m.addConstr(19 * mary + 18 * dale + 9 * paul + 4 * laura + 11 * bobby >= 107)
m.addConstr(15 * laura + 4 * bobby >= 113)
m.addConstr(22 * mary + 4 * bobby >= 86)
m.addConstr(16 * paul + 4 * bobby >= 86)
m.addConstr(24 * dale + 16 * paul + 4 * bobby >= 87)
m.addConstr(22 * mary + 24 * dale + 15 * laura >= 87)
m.addConstr(24 * dale + 15 * laura + 4 * bobby >= 87)
m.addConstr(24 * dale + 16 * paul + 4 * bobby >= 94)
m.addConstr(22 * mary + 24 * dale + 15 * laura >= 94)
m.addConstr(24 * dale + 15 * laura + 4 * bobby >= 94)
m.addConstr(24 * dale + 16 * paul + 4 * bobby >= 77)
m.addConstr(22 * mary + 24 * dale + 15 * laura >= 77)
m.addConstr(24 * dale + 15 * laura + 4 * bobby >= 77)
m.addConstr(22 * mary + 24 * dale + 16 * paul + 15 * laura + 4 * bobby >= 77)
m.addConstr(2 * laura + 6 * bobby >= 51)
m.addConstr(10 * mary + 6 * bobby >= 51)
m.addConstr(10 * mary + 7 * dale >= 96)
m.addConstr(7 * dale + 7 * paul >= 79)
m.addConstr(7 * dale + 2 * laura >= 52)
m.addConstr(10 * mary + 7 * paul >= 96)
m.addConstr(7 * paul + 6 * bobby >= 108)
m.addConstr(10 * mary + 7 * dale + 7 * paul + 2 * laura + 6 * bobby >= 108)
m.addConstr(6 * dale - 6 * bobby >= 0)
m.addConstr(-2 * mary + 3 * paul >= 0)
m.addConstr(18 * dale + 9 * paul <= 523)
m.addConstr(19 * mary + 18 * dale + 4 * laura <= 355)
m.addConstr(19 * mary + 18 * dale + 9 * paul <= 354)
m.addConstr(16 * paul + 4 * bobby <= 213)
m.addConstr(24 * dale + 4 * bobby <= 284)
m.addConstr(24 * dale + 16 * paul <= 478)
m.addConstr(15 * laura + 4 * bobby <= 202)
m.addConstr(22 * mary + 4 * bobby <= 392)
m.addConstr(24 * dale + 15 * laura <= 249)
m.addConstr(16 * paul + 15 * laura + 4 * bobby <= 215)
m.addConstr(22 * mary + 15 * laura + 4 * bobby <= 483)
m.addConstr(22 * mary + 24 * dale + 16 * paul <= 321)
m.addConstr(24 * dale + 16 * paul + 15 * laura <= 349)
m.addConstr(22 * mary + 24 * dale + 15 * laura <= 221)
m.addConstr(7 * dale + 2 * laura <= 582)
m.addConstr(7 * paul + 2 * laura <= 183)
m.addConstr(10 * mary + 7 * paul <= 325)
m.addConstr(7 * paul + 6 * bobby <= 450)
m.addConstr(2 * laura + 6 * bobby <= 406)
m.addConstr(7 * dale + 6 * bobby <= 299)


# 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('Optimization problem is infeasible.')
else:
    print('Optimization ended with status %d' % m.status)

```