## Step 1: Define the optimization problem and its constraints
The problem requires maximizing the objective function: $5.78x_0 + 4.79x_1 + 1.44x_2 + 8.87x_3$, where $x_0$ represents the quantity of scissors, $x_1$ represents the quantity of smoke detectors, $x_2$ represents the quantity of hole punches, and $x_3$ represents the quantity of mechanical pencils.

## 2: List all given constraints
- Sustainability score of scissors: $22x_0$
- Sustainability score of smoke detectors: $21x_1$
- Sustainability score of hole punches: $28x_2$
- Sustainability score of mechanical pencils: $9x_3$
- Storage space of scissors: $3x_0$
- Storage space of smoke detectors: $26x_1$
- Storage space of hole punches: $11x_2$
- Storage space of mechanical pencils: $6x_3$

## 3: Translate given constraints into mathematical expressions
1. $22x_0 \leq 294$
2. $3x_0 + 26x_1 + 11x_2 + 6x_3 \leq 373$
3. $26x_1 + 11x_2 \geq 75$
4. $26x_1 + 6x_3 \geq 77$
5. $3x_0 + 26x_1 + 6x_3 \geq 93$
6. $21x_1 + 28x_2 \leq 105$
7. $28x_2 + 9x_3 \leq 122$
8. $22x_0 + 9x_3 \leq 144$
9. $22x_0 + 28x_2 \leq 140$
10. $22x_0 + 21x_1 + 28x_2 + 9x_3 \leq 93$
11. $3x_0 + 26x_1 \leq 327$
12. $3x_0 + 6x_3 \leq 157$
13. $3x_0 + 11x_2 \leq 251$
14. $11x_2 + 6x_3 \leq 175$
15. $3x_0 + 26x_1 + 6x_3 \leq 184$
16. $3x_0 + 26x_1 + 11x_2 + 6x_3 \leq 184$

## 4: Implement the problem in Gurobi
We will use Gurobi to solve this linear programming problem. The following Python code defines the problem and solves it.

```python
import gurobi

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

    # Define variables
    scissors = model.addVar(name="scissors", vtype=gurobi.GRB.INTEGER)
    smoke_detectors = model.addVar(name="smoke_detectors", vtype=gurobi.GRB.INTEGER)
    hole_punches = model.addVar(name="hole_punches", vtype=gurobi.GRB.INTEGER)
    mechanical_pencils = model.addVar(name="mechanical_pencils", vtype=gurobi.GRB.INTEGER)

    # Objective function
    model.setObjective(5.78 * scissors + 4.79 * smoke_detectors + 1.44 * hole_punches + 8.87 * mechanical_pencils, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(22 * scissors <= 294, name="sustainability_scissors")
    model.addConstr(3 * scissors + 26 * smoke_detectors + 11 * hole_punches + 6 * mechanical_pencils <= 373, name="storage_space_total")
    model.addConstr(26 * smoke_detectors + 11 * hole_punches >= 75, name="storage_smoke_hole_min")
    model.addConstr(26 * smoke_detectors + 6 * mechanical_pencils >= 77, name="storage_smoke_mechanical_min")
    model.addConstr(3 * scissors + 26 * smoke_detectors + 6 * mechanical_pencils >= 93, name="storage_scissors_smoke_mechanical_min")
    model.addConstr(21 * smoke_detectors + 28 * hole_punches <= 105, name="sustainability_smoke_hole")
    model.addConstr(28 * hole_punches + 9 * mechanical_pencils <= 122, name="sustainability_hole_mechanical")
    model.addConstr(22 * scissors + 9 * mechanical_pencils <= 144, name="sustainability_scissors_mechanical")
    model.addConstr(22 * scissors + 28 * hole_punches <= 140, name="sustainability_scissors_hole")
    model.addConstr(22 * scissors + 21 * smoke_detectors + 28 * hole_punches + 9 * mechanical_pencils <= 93, name="sustainability_total")
    model.addConstr(3 * scissors + 26 * smoke_detectors <= 327, name="storage_scissors_smoke")
    model.addConstr(3 * scissors + 6 * mechanical_pencils <= 157, name="storage_scissors_mechanical")
    model.addConstr(3 * scissors + 11 * hole_punches <= 251, name="storage_scissors_hole")
    model.addConstr(11 * hole_punches + 6 * mechanical_pencils <= 175, name="storage_hole_mechanical")
    model.addConstr(3 * scissors + 26 * smoke_detectors + 6 * mechanical_pencils <= 184, name="storage_scissors_smoke_mechanical")
    model.addConstr(3 * scissors + 26 * smoke_detectors + 11 * hole_punches + 6 * mechanical_pencils <= 184, name="storage_total_limited")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objVal)
        print("Scissors: ", scissors.varValue)
        print("Smoke Detectors: ", smoke_detectors.varValue)
        print("Hole Punches: ", hole_punches.varValue)
        print("Mechanical Pencils: ", mechanical_pencils.varValue)
    else:
        print("The model is infeasible")

optimize_problem()
```