## Problem Description and Formulation

The company aims to maximize profit by filling shampoo and conditioner bottles within a limited time frame. The problem can be formulated as a linear programming (LP) problem. Let's define the decision variables:

- \(x\): The number of shampoo bottles to fill.
- \(y\): The number of conditioner bottles to fill.

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 5x + 6y \]

Subject to the following constraints:
1. \( x \geq 50 \) (At least 50 shampoo bottles must be filled)
2. \( y \geq 30 \) (At least 30 conditioner bottles must be filled)
3. \( 3x + 4y \leq 300 \) (The total time to fill the bottles cannot exceed 300 minutes)
4. \( x, y \geq 0 \) and are integers (Non-negativity and integrality constraints)

However, since Gurobi can handle continuous variables and we are not explicitly told that \(x\) and \(y\) must be integers (though in practice, they would be), we will proceed with the problem as stated but note that for practical purposes, \(x\) and \(y\) should be integers.

## Gurobi Code

```python
import gurobi

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

    # Define variables
    x = model.addVar(lb=50, name="shampoo_bottles")  # At least 50 shampoo bottles
    y = model.addVar(lb=30, name="conditioner_bottles")  # At least 30 conditioner bottles

    # Objective function: Maximize 5x + 6y
    model.setObjective(5 * x + 6 * y, gurobi.GRB.MAXIMIZE)

    # Constraint: 3x + 4y <= 300
    model.addConstr(3 * x + 4 * y <= 300, name="time_constraint")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: x = {x.varValue}, y = {y.varValue}")
        print(f"Maximum profit: ${5 * x.varValue + 6 * y.varValue}")
    else:
        print("The model is infeasible.")

solve_shampoo_conditioner_problem()
```

This code defines the problem using Gurobi's Python interface, solves it, and prints out the optimal values for \(x\) and \(y\) (the number of shampoo and conditioner bottles, respectively) if a solution exists. Note that while the problem description implies \(x\) and \(y\) should be integers, the code above does not explicitly enforce this. For a solution that guarantees integer values, consider using Gurobi's MIP (Mixed-Integer Programming) capabilities by setting the `vtype` of \(x\) and \(y\) to `gurobi.GRB.INTEGER`. 

To enforce integrality, modify the variable definitions as follows:
```python
x = model.addVar(lb=50, vtype=gurobi.GRB.INTEGER, name="shampoo_bottles")
y = model.addVar(lb=30, vtype=gurobi.GRB.INTEGER, name="conditioner_bottles")
```