## Problem Description and Formulation

The problem requires formulating a linear programming (LP) model to minimize the weekly wage bill for a restaurant, given certain constraints on staffing and wages.

### Decision Variables

- \(W\): Number of waiters
- \(C\): Number of cooks

### Objective Function

The objective is to minimize the total weekly wage bill. Given that waiters earn $147 per week and cooks earn $290 per week, the objective function can be formulated as:

\[ \text{Minimize:} \quad 147W + 290C \]

### Constraints

1. **Total Staff**: The restaurant requires a minimum of 50 staff.
\[ W + C \geq 50 \]

2. **Minimum Cooks**: At least 12 staff must be cooks.
\[ C \geq 12 \]

3. **Union Regulations**: The number of cooks should be at least one third the number of waiters.
\[ C \geq \frac{1}{3}W \]

4. **Weekly Wage Bill**: The weekly wage bill must be below $17,600.
\[ 147W + 290C \leq 17600 \]

5. **Non-Negativity**: The number of waiters and cooks cannot be negative.
\[ W \geq 0, C \geq 0 \]

## Gurobi Code

```python
import gurobi

def solve_restaurant_staffing_problem():
    # Create a new model
    model = gurobi.Model()

    # Decision variables
    W = model.addVar(lb=0, name="Waiters", vtype=gurobi.GRB.INTEGER)
    C = model.addVar(lb=0, name="Cooks", vtype=gurobi.GRB.INTEGER)

    # Objective function: Minimize the wage bill
    model.setObjective(147 * W + 290 * C, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(W + C >= 50, name="Total_Staff")
    model.addConstr(C >= 12, name="Minimum_Cooks")
    model.addConstr(C >= W / 3, name="Union_Regulations")
    model.addConstr(147 * W + 290 * C <= 17600, name="Wage_Bill")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution:")
        print(f"Waiters: {W.varValue}")
        print(f"Cooks: {C.varValue}")
        print(f"Minimum Wage Bill: ${model.objVal:.2f}")
    else:
        print("The model is infeasible.")

solve_restaurant_staffing_problem()
```

This code defines the LP model based on the given problem description, solves it using Gurobi, and prints out the optimal solution if one exists.