## Problem Description and Formulation

The problem is a linear programming optimization problem. Nova Furniture sells two types of chairs: a desk chair and a garden chair. The costs and profits associated with each type of chair are as follows:

- Desk Chair: Cost = $200, Profit = $100
- Garden Chair: Cost = $300, Profit = $150

The company has two main constraints:
1. The total monthly demand for both types of chairs combined will be at most 250 units.
2. The monthly manufacturing budget for chairs is $35,000.

The objective is to determine the number of units of each type of chair the company should make to maximize profit.

## Mathematical Formulation

Let \(D\) be the number of desk chairs and \(G\) be the number of garden chairs.

- Objective Function (Maximize Profit): \(100D + 150G\)
- Constraints:
  1. \(D + G \leq 250\) (Demand Constraint)
  2. \(200D + 300G \leq 35000\) (Budget Constraint)
  3. \(D \geq 0, G \geq 0\) (Non-Negativity Constraints)

## Gurobi Code

```python
import gurobi

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

    # Define variables
    D = model.addVar(name="Desk_Chair", lb=0, ub=None, obj=100)
    G = model.addVar(name="Garden_Chair", lb=0, ub=None, obj=150)

    # Add constraints
    model.addConstr(D + G <= 250, name="Demand_Constraint")
    model.addConstr(200*D + 300*G <= 35000, name="Budget_Constraint")

    # Set the model to maximize the objective function
    model.setObjective(D + G, gurobi.GRB.MAXIMIZE)

    # Update the model
    model.update()

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Desk Chairs: {D.varValue}")
        print(f"Garden Chairs: {G.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("The model is infeasible or unbounded.")

solve_nova_furniture_problem()
```

However, I realized that my formulation of the objective in the Gurobi code was incorrect; it should reflect the profit, not just `D + G`. The corrected code should be:

```python
import gurobi

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

    # Define variables
    D = model.addVar(name="Desk_Chair", lb=0, ub=None, obj=100)
    G = model.addVar(name="Garden_Chair", lb=0, ub=None, obj=150)

    # Add constraints
    model.addConstr(D + G <= 250, name="Demand_Constraint")
    model.addConstr(200*D + 300*G <= 35000, name="Budget_Constraint")

    # Set the model to maximize the objective function
    model.setObjective(D.obj * 1 + G.obj * 1, gurobi.GRB.MAXIMIZE)

    # However, the right approach is directly using the defined variables and their objectives,
    # so we actually do not need to explicitly set it as the obj attribute of the variables already defines it.

    # Update the model
    model.update()

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Desk Chairs: {D.x}")
        print(f"Garden Chairs: {G.x}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("The model is infeasible or unbounded.")

solve_nova_furniture_problem()
```