## Problem Description and Formulation

The problem is a classic example of a linear programming problem. Eric, the wood artist, wants to maximize his profit by manufacturing two types of decors: display shelves and plant stands. Each product requires a certain amount of time for carving and polishing. The goal is to determine the optimal number of each type of decor to produce given the available time for carving and polishing.

### Decision Variables

Let:
- \(x\) be the number of display shelves produced.
- \(y\) be the number of plant stands produced.

### Objective Function

The profit is $55 for each display shelf and $45 for each plant stand. The objective is to maximize the total profit:
\[ \text{Maximize:} \quad 55x + 45y \]

### Constraints

1. **Carving Time Constraint:** Each display shelf requires 25 minutes for carving, and each plant stand requires 20 minutes. There are 350 minutes available for carving:
\[ 25x + 20y \leq 350 \]

2. **Polishing Time Constraint:** Each display shelf requires 20 minutes for polishing, and each plant stand requires 10 minutes. There are 600 minutes available for polishing:
\[ 20x + 10y \leq 600 \]

3. **Non-Negativity Constraints:** The number of display shelves and plant stands cannot be negative:
\[ x \geq 0, \quad y \geq 0 \]

## Gurobi Code

To solve this problem using Gurobi in Python, we can use the following code:

```python
import gurobi

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

    # Define the decision variables
    x = model.addVar(name="display_shelves", lb=0, vtype=gurobi.GRB.CONTINUOUS)
    y = model.addVar(name="plant_stands", lb=0, vtype=gurobi.GRB.CONTINUOUS)

    # Define the objective function
    model.setObjective(55 * x + 45 * y, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(25 * x + 20 * y <= 350, name="carving_time_constraint")
    model.addConstr(20 * x + 10 * y <= 600, name="polishing_time_constraint")

    # Optimize the model
    model.optimize()

    # Print the status of the optimization
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found: x = {x.varValue}, y = {y.varValue}")
        print(f"Maximum profit: ${55 * x.varValue + 45 * y.varValue:.2f}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```

However, note that Gurobi typically works best with integer solutions and the above problem might yield a non-integer solution. If integer solutions are required (which makes sense in this context since you can't produce a fraction of a decor), we should adjust the code to reflect that:

```python
import gurobi

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

    # Define the decision variables as integers
    x = model.addVar(name="display_shelves", lb=0, vtype=gurobi.GRB.INTEGER)
    y = model.addVar(name="plant_stands", lb=0, vtype=gurobi.GRB.INTEGER)

    # Define the objective function
    model.setObjective(55 * x + 45 * y, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(25 * x + 20 * y <= 350, name="carving_time_constraint")
    model.addConstr(20 * x + 10 * y <= 600, name="polishing_time_constraint")

    # Optimize the model
    model.optimize()

    # Print the status of the optimization
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found: x = {x.varValue}, y = {y.varValue}")
        print(f"Maximum profit: ${55 * x.varValue + 45 * y.varValue:.2f}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```