## Symbolic Representation

The problem can be converted into a symbolic representation as follows:

- **Variables:**
  - $x_1$ : Number of mountain bikes
  - $x_2$ : Number of road bikes

- **Objective Function:** Maximize profit $= 300x_1 + 500x_2$

- **Constraints:**
  1. $x_1 + x_2 \leq 150$ (Monthly demand constraint)
  2. $750x_1 + 1000x_2 \leq 40000$ (Total worth of bikes in stock constraint)
  3. $x_1 \geq 0, x_2 \geq 0$ (Non-negativity constraint)

## JSON Representation

```json
{
    'sym_variables': [('x1', 'mountain bikes'), ('x2', 'road bikes')],
    'objective_function': '300*x1 + 500*x2',
    'constraints': [
        'x1 + x2 <= 150',
        '750*x1 + 1000*x2 <= 40000',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code

```python
import gurobipy as gp

def solve_bike_shop_problem():
    # Create a new model
    model = gp.Model("Bike_Shop_Problem")

    # Define variables
    x1 = model.addVar(name="mountain_bikes", lb=0, vtype=gp.GRB.INTEGER)  # Number of mountain bikes
    x2 = model.addVar(name="road_bikes", lb=0, vtype=gp.GRB.INTEGER)    # Number of road bikes

    # Objective function: Maximize profit
    model.setObjective(300*x1 + 500*x2, gp.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(x1 + x2 <= 150, name="demand_constraint")  # Monthly demand constraint
    model.addConstr(750*x1 + 1000*x2 <= 40000, name="stock_constraint")  # Total worth of bikes in stock constraint

    # Solve the model
    model.optimize()

    # Print solution
    if model.status == gp.GRB.OPTIMAL:
        print(f"Optimal solution: Mountain Bikes = {x1.varValue}, Road Bikes = {x2.varValue}")
        print(f"Maximum Profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

# Run the function
solve_bike_shop_problem()
```