To solve the given optimization problem using Gurobi, we first need to translate the natural language description into a mathematical formulation. The objective function to be minimized is:

9 * (hours worked by Bobby) + 8 * (hours worked by Jean) + 2 * (hours worked by Hank) + 6 * (hours worked by George)

Subject to the constraints:

1. Dollar cost per hour for each worker: 
   - Bobby: $3
   - Jean: $15
   - Hank: $12
   - George: $17

2. Combined dollar cost constraints:
   - Jean + George ≥ $40
   - Bobby + Jean + George ≥ $38
   - Bobby + Jean + Hank + George ≥ $38
   - -3 * (hours worked by Hank) + 10 * (hours worked by George) ≥ 0
   - Bobby + George ≤ $113
   - Bobby + Hank + George ≤ $52

3. Integer constraints:
   - Hours worked by Hank must be an integer.

Given the above, we can formulate this problem in Gurobi as follows:

```python
from gurobipy import *

# Create a model
m = Model("Optimization_Problem")

# Define variables
Bobby_hours = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Bobby")
Jean_hours = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Jean")
Hank_hours = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Hank")
George_hours = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_George")

# Objective function
m.setObjective(9 * Bobby_hours + 8 * Jean_hours + 2 * Hank_hours + 6 * George_hours, GRB.MINIMIZE)

# Constraints
m.addConstr(15 * Jean_hours + 17 * George_hours >= 40, name="Constraint_1")
m.addConstr(3 * Bobby_hours + 15 * Jean_hours + 17 * George_hours >= 38, name="Constraint_2")
m.addConstr(3 * Bobby_hours + 15 * Jean_hours + 12 * Hank_hours + 17 * George_hours >= 38, name="Constraint_3")
m.addConstr(-3 * Hank_hours + 10 * George_hours >= 0, name="Constraint_4")
m.addConstr(3 * Bobby_hours + 17 * George_hours <= 113, name="Constraint_5")
m.addConstr(3 * Bobby_hours + 12 * Hank_hours + 17 * George_hours <= 52, name="Constraint_6")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Bobby hours: {Bobby_hours.x}")
    print(f"Jean hours: {Jean_hours.x}")
    print(f"Hank hours: {Hank_hours.x}")
    print(f"George hours: {George_hours.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```