## Problem Description and Formulation

The furniture company sells two types of tables: a dining table and a coffee table, with production costs of $250 and $150, respectively. The profit on each dining table is $200, and on each coffee table is $100. The company has two main constraints:

1. The total monthly demand for both types of tables combined is at most 200 units.
2. The monthly manufacturing budget for tables is $20,000.

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

## Mathematical Formulation

Let \(D\) be the number of dining tables and \(C\) be the number of coffee tables.

- The profit \(P\) from selling \(D\) dining tables and \(C\) coffee tables is given by:
\[ P = 200D + 100C \]

- The cost of producing \(D\) dining tables and \(C\) coffee tables is:
\[ \text{Cost} = 250D + 150C \]

- The total demand constraint is:
\[ D + C \leq 200 \]

- The budget constraint is:
\[ 250D + 150C \leq 20000 \]

- Non-negativity constraints:
\[ D \geq 0, C \geq 0 \]

## Gurobi Code

```python
import gurobi

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

    # Define variables
    D = model.addVar(name="Dining_Table", lb=0, vtype=gurobi.GRB.INTEGER)
    C = model.addVar(name="Coffee_Table", lb=0, vtype=gurobi.GRB.INTEGER)

    # Objective function: Maximize profit
    model.setObjective(200 * D + 100 * C, gurobi.GRB.MAXIMIZE)

    # Add constraints
    model.addConstr(D + C <= 200, name="Demand_Constraint")
    model.addConstr(250 * D + 150 * C <= 20000, name="Budget_Constraint")

    # Optimize model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal production: Dining tables = {D.varValue}, Coffee tables = {C.varValue}")
        print(f"Maximum profit: ${model.objVal}")
    else:
        print("No optimal solution found.")

if __name__ == "__main__":
    solve_table_production()
```