To solve this problem, we first need to define the variables and the objective function. Let's denote the number of shampoo bottles as \(S\) and the number of conditioner bottles as \(C\). The profit per shampoo bottle is $5, and the profit per conditioner bottle is $6. Therefore, the total profit can be represented as \(5S + 6C\).

The constraints are:
1. Time constraint: Each shampoo bottle takes 3 minutes to fill, and each conditioner bottle takes 4 minutes to fill. The company has 300 minutes available. So, \(3S + 4C \leq 300\).
2. Shampoo bottles constraint: The company must fill at least 50 shampoo bottles. So, \(S \geq 50\).
3. Conditioner bottles constraint: The company must fill at least 30 conditioner bottles. So, \(C \geq 30\).

Since the goal is to maximize profit, we want to find the values of \(S\) and \(C\) that maximize \(5S + 6C\) under these constraints.

Here's how we can represent this problem in Gurobi code:

```python
from gurobipy import *

# Create a model
m = Model("Shampoo_Conditioner_Problem")

# Define the variables
S = m.addVar(lb=50, vtype=GRB.INTEGER, name="Shampoo_Bottles")
C = m.addVar(lb=30, vtype=GRB.INTEGER, name="Conditioner_Bottles")

# Set the objective function to maximize profit
m.setObjective(5*S + 6*C, GRB.MAXIMIZE)

# Add the time constraint
m.addConstr(3*S + 4*C <= 300, "Time_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Shampoo Bottles: {S.x}")
    print(f"Conditioner Bottles: {C.x}")
    print(f"Maximum Profit: ${5*S.x + 6*C.x}")
else:
    print("No optimal solution found")
```