## Problem Description and Formulation

The artist needs to maximize profit by deciding how many mini elephants and lions to produce given certain constraints. Let's denote the number of mini elephants as \(E\) and the number of mini lions as \(L\).

### Objective Function

The profit per mini elephant is $50, and the profit per mini lion is $45. The objective is to maximize the total profit \(P\), which can be represented as:

\[P = 50E + 45L\]

### Constraints

1. **Clay Constraint**: Each mini elephant requires 10 units of clay, and each mini lion requires 8 units of clay. The artist has 300 units of clay available. This can be represented as:

\[10E + 8L \leq 300\]

2. **Production Limit Constraint**: The artist can make at most 33 animals total. This can be represented as:

\[E + L \leq 33\]

3. **Non-Negativity Constraint**: The number of mini elephants and lions cannot be negative:

\[E \geq 0, L \geq 0\]
\[E \in \mathbb{Z}, L \in \mathbb{Z}\] (Since the artist cannot produce a fraction of an animal)

### Gurobi Code

To solve this linear programming problem (with integer constraints, making it an integer programming problem), we can use the Gurobi Optimizer in Python. Note that we will use the `Model` class from `gurobipy` to formulate and solve the problem.

```python
from gurobipy import *

# Create a new model
model = Model("Artist Production Problem")

# Define variables
E = model.addVar(lb=0, name="Mini_Elephants", vtype=GRB.INTEGER)  # Number of mini elephants
L = model.addVar(lb=0, name="Mini_Lions", vtype=GRB.INTEGER)     # Number of mini lions

# Objective function: Maximize profit
model.setObjective(50*E + 45*L, GRB.MAXIMIZE)

# Constraints
model.addConstr(10*E + 8*L <= 300, name="Clay_Constraint")         # Clay constraint
model.addConstr(E + L <= 33, name="Production_Limit_Constraint")    # Production limit constraint

# Solve the model
model.optimize()

# Check if the model is optimized
if model.status == GRB.Status.OPTIMAL:
    print(f"Optimal Solution: Mini Elephants = {E.varValue}, Mini Lions = {L.varValue}")
    print(f"Max Profit: ${model.objVal:.2f}")
else:
    print("The model is infeasible.")
```

This code formulates the artist's production problem as an integer programming problem and solves it using Gurobi. The solution will indicate how many mini elephants and lions the artist should produce to maximize profit under the given constraints.