## Problem Description and Symbolic Representation

The problem involves a sandwich store that produces meatball sandwiches and ham sandwiches. The goal is to maximize profit given the available resources (meat, cheese, and sauce).

### Symbolic Variables:
- $x_1$ = Number of meatball sandwiches
- $x_2$ = Number of ham sandwiches

### Objective Function:
The profit per meatball sandwich is $3, and the profit per ham sandwich is $3.50. The objective function to maximize profit ($P$) is:
\[ P = 3x_1 + 3.50x_2 \]

### Constraints:
1. Meat constraint: $25x_1 + 30x_2 \leq 4000$
2. Cheese constraint: $10x_1 + 25x_2 \leq 5000$
3. Sauce constraint: $50x_1 + 20x_2 \leq 5200$
4. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'meatball sandwiches'), ('x2', 'ham sandwiches')],
    'objective_function': '3*x1 + 3.50*x2',
    'constraints': [
        '25*x1 + 30*x2 <= 4000',
        '10*x1 + 25*x2 <= 5000',
        '50*x1 + 20*x2 <= 5200',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

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

# Define variables
x1 = m.addVar(name="meatball_sandwiches", lb=0, vtype=gp.GRB.CONTINUOUS)
x2 = m.addVar(name="ham_sandwiches", lb=0, vtype=gp.GRB.CONTINUOUS)

# Objective function
m.setObjective(3*x1 + 3.50*x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(25*x1 + 30*x2 <= 4000, name="meat_constraint")
m.addConstr(10*x1 + 25*x2 <= 5000, name="cheese_constraint")
m.addConstr(50*x1 + 20*x2 <= 5200, name="sauce_constraint")

# Solve the model
m.optimize()

# Print the results
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Meatball Sandwiches: {x1.varValue}")
    print(f"Ham Sandwiches: {x2.varValue}")
    print(f"Max Profit: {m.objVal}")
else:
    print("The model is infeasible or has no optimal solution.")
```