## Problem Description and Formulation

The pizza shop has two types of pizzas, A and B, with different requirements for mozzarella and American cheese. The goal is to maximize profit given the available amounts of cheese.

Let's denote:
- \(x_A\) as the number of Pizza A to be made,
- \(x_B\) as the number of Pizza B to be made.

The constraints based on the available cheese are:
1. Mozzarella cheese: \(4x_A + 5x_B \leq 600\)
2. American cheese: \(5x_A + 3x_B \leq 500\)

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 3x_A + 4x_B \]

Also, \(x_A \geq 0\) and \(x_B \geq 0\) since the number of pizzas cannot be negative.

## Gurobi Code

```python
import gurobi

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

    # Define variables
    x_A = model.addVar(lb=0, name="Pizza_A")
    x_B = model.addVar(lb=0, name="Pizza_B")

    # Objective function: Maximize profit
    model.setObjective(3 * x_A + 4 * x_B, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(4 * x_A + 5 * x_B <= 600, name="Mozzarella_cheese_constraint")
    model.addConstr(5 * x_A + 3 * x_B <= 500, name="American_cheese_constraint")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: Pizza A = {x_A.varValue}, Pizza B = {x_B.varValue}")
        print(f"Max Profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

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