To solve this optimization problem, we first need to define the variables, objective function, and constraints based on the given description.

## Step 1: Define Variables
Let's denote the variables as follows:
- \(x_0\): bottles of ibuprofen
- \(x_1\): toilet paper rolls
- \(x_2\): cookies
- \(x_3\): lightbulbs

## Step 2: Objective Function
The objective function to minimize is:
\[8x_0 + 2x_1 + 9x_2 + x_3\]

## Step 3: Constraints
### Resource Constraints
- Usefulness ratings: 
  - \(8x_0 + 14x_1 + 7x_2 + 7x_3\)
- Storage space: 
  - \(10x_0 + 13x_1 + 8x_2 + 6x_3\)

### Individual Item Constraints
- \(r0\): Usefulness rating constraints
  - \(8x_0 \leq 208\)
  - \(14x_1 \leq 208\)
  - \(7x_2 \leq 208\)
  - \(7x_3 \leq 208\)
- \(r1\): Storage space constraints
  - \(10x_0 \leq 182\)
  - \(13x_1 \leq 182\)
  - \(8x_2 \leq 182\)
  - \(6x_3 \leq 182\)

### Combined Usefulness Rating Constraints
- \(8x_0 + 7x_2 \geq 36\)
- \(8x_0 + 7x_3 \geq 47\)
- \(8x_0 + 14x_1 + 7x_3 \geq 29\)
- \(14x_1 + 7x_2 + 7x_3 \geq 29\)
- \(8x_0 + 14x_1 + 7x_3 \geq 35\)
- \(14x_1 + 7x_2 + 7x_3 \geq 35\)
- \(8x_0 + 14x_1 + 7x_2 + 7x_3 \geq 35\)

### Combined Storage Space Constraints
- \(8x_2 + 6x_3 \geq 43\)
- \(10x_0 + 8x_2 \geq 31\)
- \(10x_0 + 13x_1 \geq 19\)
- \(13x_1 + 8x_2 + 6x_3 \geq 38\)
- \(10x_0 + 13x_1 + 6x_3 \geq 38\)
- \(13x_1 + 8x_2 + 6x_3 \geq 29\)
- \(10x_0 + 13x_1 + 6x_3 \geq 29\)
- \(10x_0 + 13x_1 + 8x_2 + 6x_3 \geq 29\)

### Linear Constraint
- \(5x_1 - 2x_3 \geq 0\)

### Bounds for Storage
- \(8x_2 + 6x_3 \leq 74\)
- \(10x_0 + 13x_1 + 6x_3 \leq 77\)
- \(10x_0 + 8x_2 + 6x_3 \leq 96\)

### Variable Constraints
- \(x_0, x_1, x_2, x_3\) are integers
- \(x_0 \geq 0\), \(x_1 \geq 0\), \(x_2 \geq 0\), \(x_3 \geq 0\)

## Step 4: Implement in Gurobi
```python
import gurobi

def optimize_problem():
    model = gurobi.Model()

    # Define variables
    x0 = model.addVar(name="bottles_of_ibuprofen", vtype=gurobi.GRB.INTEGER)
    x1 = model.addVar(name="toilet_paper_rolls", vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name="cookies", vtype=gurobi.GRB.INTEGER)
    x3 = model.addVar(name="lightbulbs", vtype=gurobi.GRB.INTEGER)

    # Objective function
    model.setObjective(8*x0 + 2*x1 + 9*x2 + x3, gurobi.GRB.MINIMIZE)

    # Individual item constraints
    model.addConstr(8*x0 <= 208)
    model.addConstr(14*x1 <= 208)
    model.addConstr(7*x2 <= 208)
    model.addConstr(7*x3 <= 208)
    model.addConstr(10*x0 <= 182)
    model.addConstr(13*x1 <= 182)
    model.addConstr(8*x2 <= 182)
    model.addConstr(6*x3 <= 182)

    # Combined usefulness rating constraints
    model.addConstr(8*x0 + 7*x2 >= 36)
    model.addConstr(8*x0 + 7*x3 >= 47)
    model.addConstr(8*x0 + 14*x1 + 7*x3 >= 29)
    model.addConstr(14*x1 + 7*x2 + 7*x3 >= 29)
    model.addConstr(8*x0 + 14*x1 + 7*x3 >= 35)
    model.addConstr(14*x1 + 7*x2 + 7*x3 >= 35)
    model.addConstr(8*x0 + 14*x1 + 7*x2 + 7*x3 >= 35)

    # Combined storage space constraints
    model.addConstr(8*x2 + 6*x3 >= 43)
    model.addConstr(10*x0 + 8*x2 >= 31)
    model.addConstr(10*x0 + 13*x1 >= 19)
    model.addConstr(13*x1 + 8*x2 + 6*x3 >= 38)
    model.addConstr(10*x0 + 13*x1 + 6*x3 >= 38)
    model.addConstr(13*x1 + 8*x2 + 6*x3 >= 29)
    model.addConstr(10*x0 + 13*x1 + 6*x3 >= 29)
    model.addConstr(10*x0 + 13*x1 + 8*x2 + 6*x3 >= 29)

    # Linear constraint
    model.addConstr(5*x1 - 2*x3 >= 0)

    # Bounds for storage
    model.addConstr(8*x2 + 6*x3 <= 74)
    model.addConstr(10*x0 + 13*x1 + 6*x3 <= 77)
    model.addConstr(10*x0 + 8*x2 + 6*x3 <= 96)

    # Non-negativity constraints
    model.addConstr(x0 >= 0)
    model.addConstr(x1 >= 0)
    model.addConstr(x2 >= 0)
    model.addConstr(x3 >= 0)

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objVal)
        print("bottles_of_ibuprofen: ", x0.varValue)
        print("toilet_paper_rolls: ", x1.varValue)
        print("cookies: ", x2.varValue)
        print("lightbulbs: ", x3.varValue)
    else:
        print("No solution found")

optimize_problem()
```