## Step 1: Define the symbolic representation of the problem
Let's denote the number of acres for tulips as $x_1$ and for orchids as $x_2$. The objective is to maximize profit, which is $75x_1 + 105x_2$. The constraints are:
1. $x_1 + x_2 \leq 120$ (total acres of land),
2. $15x_1 + 40x_2 \leq 1200$ (total budget for seeds),
3. $x_1 \geq 0$ and $x_2 \geq 0$ (non-negativity constraints, as acres cannot be negative).

## Step 2: Convert the problem into a symbolic representation
The symbolic representation can be written as:
- Variables: $(x_1, \text{tulips})$, $(x_2, \text{orchids})$
- Objective function: $75x_1 + 105x_2$
- Constraints:
  1. $x_1 + x_2 \leq 120$
  2. $15x_1 + 40x_2 \leq 1200$
  3. $x_1 \geq 0$
  4. $x_2 \geq 0$

In the required format:
```json
{
'sym_variables': [('x1', 'tulips'), ('x2', 'orchids')],
'objective_function': '75*x1 + 105*x2',
'constraints': ['x1 + x2 <= 120', '15*x1 + 40*x2 <= 1200', 'x1 >= 0', 'x2 >= 0']
}
```

## Step 3: Implement the problem in Gurobi code
Now, let's implement this problem using Gurobi in Python:
```python
import gurobi

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

    # Define variables
    x1 = model.addVar(name="tulips", lb=0, ub=120)  # acres of tulips
    x2 = model.addVar(name="orchids", lb=0, ub=120)  # acres of orchids

    # Objective function: maximize 75*x1 + 105*x2
    model.setObjective(75*x1 + 105*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(x1 + x2 <= 120, name="land_constraint")
    model.addConstr(15*x1 + 40*x2 <= 1200, name="budget_constraint")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal acres of tulips: {x1.varValue}")
        print(f"Optimal acres of orchids: {x2.varValue}")
        print(f"Max profit: {model.objVal}")
    else:
        print("The problem is infeasible")

solve_optimization_problem()
```