## Problem Description and Symbolic Representation

The problem requires maximizing profit from selling hockey sticks and pucks under certain constraints. Let's denote:
- $x_1$ as the number of hockey sticks sold
- $x_2$ as the number of pucks sold

The profit from selling one hockey stick is $50, and from selling one puck is $5. Therefore, the objective function to maximize profit is:
\[ \text{Maximize:} \quad 50x_1 + 5x_2 \]

The constraints given are:
1. The store can spend at most $20,000 on hockey sticks and pucks. Given that a hockey stick costs $75 and a puck costs $2, we have:
\[ 75x_1 + 2x_2 \leq 20000 \]

2. At least 50 but at most 110 hockey sticks are sold each month:
\[ 50 \leq x_1 \leq 110 \]

3. The number of pucks sold is at most three times the number of hockey sticks sold:
\[ x_2 \leq 3x_1 \]

4. Non-negativity constraints (assuming you cannot sell a negative number of items):
\[ x_1 \geq 0, \quad x_2 \geq 0 \]

However, given that $x_1$ has a lower bound of 50, the $x_1 \geq 0$ constraint is implicitly satisfied.

## Symbolic Representation

```json
{
    'sym_variables': [('x1', 'hockey sticks'), ('x2', 'pucks')],
    'objective_function': '50*x1 + 5*x2',
    'constraints': [
        '75*x1 + 2*x2 <= 20000',
        '50 <= x1 <= 110',
        'x2 <= 3*x1'
    ]
}
```

## Gurobi Code

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Hockey_Sticks_and_Pucks")

# Define variables
x1 = model.addVar(lb=50, ub=110, name="hockey_sticks")  # At least 50, at most 110 hockey sticks
x2 = model.addVar(lb=0, name="pucks")  # Non-negative number of pucks

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

# Constraints
model.addConstr(75*x1 + 2*x2 <= 20000, name="budget_constraint")  # Budget constraint
model.addConstr(x2 <= 3*x1, name="pucks_to_sticks_ratio")  # Pucks to sticks ratio

# Solve the model
model.optimize()

# Print solution
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal number of hockey sticks: {x1.varValue}")
    print(f"Optimal number of pucks: {x2.varValue}")
    print(f"Maximal profit: {model.objVal}")
else:
    print("The model is infeasible.")
```