## Step 1: Define the symbolic representation of the variables
The variables are 'bottles of ibuprofen' and 'cookies', which can be represented symbolically as $x_1$ and $x_2$ respectively.

## Step 2: Convert the objective function into a symbolic representation
The objective function to minimize is $7.61x_1 + 4.87x_2$.

## Step 3: Convert the constraints into a symbolic representation
The constraints are:
1. $19x_1 + 16x_2 \geq 32$
2. $3x_1 - x_2 \geq 0$
3. $19x_1 + 16x_2 \leq 95$
4. $x_1$ is an integer (nonfractional number of bottles of ibuprofen)
5. $x_2$ is an integer (whole number amount of cookies)

## 4: Define the symbolic representation of the problem
```json
{
'sym_variables': [('x1', 'bottles of ibuprofen'), ('x2', 'cookies')], 
'objective_function': '7.61*x1 + 4.87*x2', 
'constraints': [
    '19*x1 + 16*x2 >= 32', 
    '3*x1 - x2 >= 0', 
    '19*x1 + 16*x2 <= 95', 
    'x1 >= 0 and x1 is an integer', 
    'x2 >= 0 and x2 is an integer'
    ]
}
```

## 5: Implement the optimization problem using Gurobi
```python
import gurobi

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

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

    # Set the objective function
    model.setObjective(7.61 * x1 + 4.87 * x2, gurobi.GRB.MINIMIZE)

    # Add constraints
    model.addConstr(19 * x1 + 16 * x2 >= 32)
    model.addConstr(3 * x1 - x2 >= 0)
    model.addConstr(19 * x1 + 16 * x2 <= 95)

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Bottles of ibuprofen: {x1.varValue}")
        print(f"Cookies: {x2.varValue}")
        print(f"Objective function value: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```