## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a framing company that produces printed art and paintings, given the constraints on printing and framing time.

Let's define the decision variables:

* `x`: the number of printed art produced
* `y`: the number of paintings produced

The objective function is to maximize the total profit:

* Profit per printed art: $5
* Profit per painting: $8
* Total profit: `5x + 8y`

The constraints are:

* Printing time: 10 minutes per printed art, 0 minutes per painting, and 150 minutes available
* Framing time: 5 minutes per printed art, 15 minutes per painting, and 400 minutes available
* Non-negativity: `x >= 0` and `y >= 0`

The constraints can be formulated as:

* `10x <= 150` (printing time constraint)
* `5x + 15y <= 400` (framing time constraint)
* `x >= 0` and `y >= 0` (non-negativity constraints)

## Gurobi Code

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Framing_Company")

# Define the decision variables
x = model.addVar(lb=0, name="printed_art")
y = model.addVar(lb=0, name="paintings")

# Define the objective function
model.setObjective(5*x + 8*y, gp.GRB.MAXIMIZE)

# Define the constraints
model.addConstr(10*x <= 150, name="printing_time")
model.addConstr(5*x + 15*y <= 400, name="framing_time")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Printed art: {x.varValue}")
    print(f"Paintings: {y.varValue}")
    print(f"Max profit: {model.objVal}")
else:
    print("No optimal solution found.")
```

This code defines the decision variables, objective function, and constraints, and then solves the model using Gurobi. The solution is printed out, including the optimal values of `x` and `y`, and the maximum profit. If no optimal solution is found, a message indicating this is printed out.