## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The wood artist wants to maximize her profit by producing two types of decors: vase décors and wood canvases. Each product has specific requirements for carving and polishing, and there are limited minutes available for each process.

Let's define the decision variables:

* `vase`: number of vase décors produced
* `wood_canvas`: number of wood canvases produced

The objective function is to maximize the profit:

* Profit per vase décor: $50
* Profit per wood canvas: $85

The constraints are:

* Carving time: 20 minutes per vase décor, 18 minutes per wood canvas, and 400 minutes available
* Polishing time: 14 minutes per vase décor, 8 minutes per wood canvas, and 640 minutes available

## Mathematical Formulation

Maximize: `50 * vase + 85 * wood_canvas`

Subject to:

* `20 * vase + 18 * wood_canvas <= 400` (carving time constraint)
* `14 * vase + 8 * wood_canvas <= 640` (polishing time constraint)
* `vase >= 0` and `wood_canvas >= 0` (non-negativity constraints)

## Gurobi Code

```python
import gurobi

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

# Define the decision variables
vase = model.addVar(lb=0, name="vase")
wood_canvas = model.addVar(lb=0, name="wood_canvas")

# Define the objective function
model.setObjective(50 * vase + 85 * wood_canvas, gurobi.GRB.MAXIMIZE)

# Define the constraints
model.addConstr(20 * vase + 18 * wood_canvas <= 400, name="carving_time_constraint")
model.addConstr(14 * vase + 8 * wood_canvas <= 640, name="polishing_time_constraint")

# Optimize the model
model.optimize()

# Print the solution
if model.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Vase décors: {vase.varValue}")
    print(f"Wood canvases: {wood_canvas.varValue}")
    print(f"Max profit: {model.objVal}")
else:
    print("No optimal solution found.")
```