## Problem Description and Formulation

The problem is an optimization problem with four variables: 
- packs of napkins
- dish soap bottles
- paper towel rolls
- toilet paper rolls

The objective function to minimize is: 
\[ 10.0 \times \text{packs of napkins} + 6.84 \times \text{dish soap bottles} + 5.05 \times \text{paper towel rolls} + 1.44 \times \text{toilet paper rolls} \]

The problem has several constraints related to storage space and the integer requirements of the variables.

## Constraints

1. Storage space constraints:
   - packs of napkins: 8 sq. ft.
   - dish soap bottles: 4 sq. ft.
   - paper towel rolls: 3 sq. ft.
   - toilet paper rolls: 6 sq. ft.

2. Total storage space constraints:
   - Total storage space available: 97 sq. ft.
   - Paper towel rolls + toilet paper rolls >= 14 sq. ft.
   - Dish soap bottles + paper towel rolls >= 18 sq. ft.
   - Packs of napkins + paper towel rolls >= 24 sq. ft.
   - Packs of napkins + dish soap bottles >= 11 sq. ft.
   - Packs of napkins + dish soap bottles + paper towel rolls + toilet paper rolls >= 11 sq. ft.

3. Specific combined storage space constraints:
   - -7 * packs of napkins + 8 * paper towel rolls >= 0
   - Packs of napkins + dish soap bottles <= 62 sq. ft.
   - Packs of napkins + dish soap bottles + paper towel rolls <= 73 sq. ft.
   - Packs of napkins + dish soap bottles + toilet paper rolls <= 96 sq. ft.
   - Dish soap bottles + paper towel rolls + toilet paper rolls <= 59 sq. ft.

4. Integer constraints:
   - Packs of napkins: integer
   - Dish soap bottles: integer
   - Paper towel rolls: integer
   - Toilet paper rolls: integer

## Gurobi Code

```python
import gurobi

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

    # Define the variables
    packs_of_napkins = model.addVar(name="packs_of_napkins", integer=True)
    dish_soap_bottles = model.addVar(name="dish_soap_bottles", integer=True)
    paper_towel_rolls = model.addVar(name="paper_towel_rolls", integer=True)
    toilet_paper_rolls = model.addVar(name="toilet_paper_rolls", integer=True)

    # Objective function
    model.setObjective(10.0 * packs_of_napkins + 6.84 * dish_soap_bottles + 5.05 * paper_towel_rolls + 1.44 * toilet_paper_rolls, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(8 * packs_of_napkins + 4 * dish_soap_bottles + 3 * paper_towel_rolls + 6 * toilet_paper_rolls <= 97, "storage_space")
    model.addConstr(paper_towel_rolls + toilet_paper_rolls >= 14, "min_paper_towel_toilet_paper_space")
    model.addConstr(dish_soap_bottles + paper_towel_rolls >= 18, "min_dish_soap_paper_towel_space")
    model.addConstr(packs_of_napkins + paper_towel_rolls >= 24, "min_packs_paper_towel_space")
    model.addConstr(packs_of_napkins + dish_soap_bottles >= 11, "min_packs_dish_soap_space")
    model.addConstr(packs_of_napkins + dish_soap_bottles + paper_towel_rolls + toilet_paper_rolls >= 11, "min_total_space")
    model.addConstr(-7 * packs_of_napkins + 8 * paper_towel_rolls >= 0, "packs_paper_towel_relation")
    model.addConstr(packs_of_napkins + dish_soap_bottles <= 62, "max_packs_dish_soap_space")
    model.addConstr(packs_of_napkins + dish_soap_bottles + paper_towel_rolls <= 73, "max_packs_dish_soap_paper_towel_space")
    model.addConstr(packs_of_napkins + dish_soap_bottles + toilet_paper_rolls <= 96, "max_packs_dish_soap_toilet_paper_space")
    model.addConstr(dish_soap_bottles + paper_towel_rolls + toilet_paper_rolls <= 59, "max_dish_soap_paper_towel_toilet_paper_space")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.Status.OPTIMAL:
        print("Objective: ", model.objVal)
        print("Packs of napkins: ", packs_of_napkins.varValue)
        print("Dish soap bottles: ", dish_soap_bottles.varValue)
        print("Paper towel rolls: ", paper_towel_rolls.varValue)
        print("Toilet paper rolls: ", toilet_paper_rolls.varValue)
    else:
        print("The model is infeasible")

solve_optimization_problem()
```