## Problem Description and Formulation

The problem is a classic example of a linear programming problem. Blue Novel Furniture produces two types of tables: coffee tables and bedside tables. The goal is to determine the optimal number of each type of table to manufacture in order to maximize the total monthly profit.

Let's define the decision variables:

* $x$: number of coffee tables produced
* $y$: number of bedside tables produced

The objective function is to maximize the total monthly profit:

* Profit per coffee table: $50
* Profit per bedside table: $90
* Objective function: Maximize $50x + 90y$

The constraints are:

* Producing parts: 2.5 hours per coffee table and 4.5 hours per bedside table, with a total of 6500 hours available: $2.5x + 4.5y \leq 6500$
* Assembling parts: 3 hours per coffee table and 2 hours per bedside table, with a total of 3500 hours available: $3x + 2y \leq 3500$
* Polishing: 1.5 hours per coffee table and 3.5 hours per bedside table, with a total of 5000 hours available: $1.5x + 3.5y \leq 5000$
* Non-negativity constraints: $x \geq 0, y \geq 0$

## Gurobi Code

```python
import gurobi

# Create a new model
model = gurobi.Model()

# Define the decision variables
x = model.addVar(name="coffee_tables", lb=0, ub=None, obj=50)
y = model.addVar(name="bedside_tables", lb=0, ub=None, obj=90)

# Define the constraints
model.addConstr(2.5 * x + 4.5 * y <= 6500, name="parts_production")
model.addConstr(3 * x + 2 * y <= 3500, name="parts_assembly")
model.addConstr(1.5 * x + 3.5 * y <= 5000, name="polishing")

# Set the objective function to maximize
model.setObjective(x.obj + y.obj, gurobi.GRB.MAXIMIZE)

# Optimize the model
model.optimize()

# Print the results
if model.status == gurobi.GRB.OPTIMAL:
    print(f"Coffee tables: {x.x:.2f}")
    print(f"Bedside tables: {y.x:.2f}")
    print(f"Max profit: {model.objVal:.2f}")
else:
    print("The model is infeasible")
```

This code defines the decision variables, objective function, and constraints, and then solves the model using Gurobi's optimization algorithm. The results are printed to the console, including the optimal number of coffee tables and bedside tables to produce, and the maximum profit.