To solve this optimization problem, we first need to define the decision variables and the constraints based on the given information.

Let's denote:
- \(F\) as the number of fruit smoothies made,
- \(V\) as the number of vegetable smoothies made.

The profit per fruit smoothie is $4, and per vegetable smoothie is $5. Therefore, the total profit (\(P\)) can be represented as:
\[P = 4F + 5V\]

The constraints are based on the time available for each machine:
1. The cutting machine: \(5F + 7V \leq 400\) (since it takes 5 minutes to cut a fruit smoothie and 7 minutes to cut a vegetable smoothie, and there are at most 400 minutes available).
2. The blending machine: \(5F + 4V \leq 400\) (since it takes 5 minutes to blend a fruit smoothie and 4 minutes to blend a vegetable smoothie, and there are at most 400 minutes available).

Additionally, we know that \(F \geq 0\) and \(V \geq 0\), because the number of smoothies cannot be negative.

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Smoothie_Optimization")

# Define the decision variables
F = m.addVar(vtype=GRB.INTEGER, name="Fruit_Smoothies")
V = m.addVar(vtype=GRB.INTEGER, name="Vegetable_Smoothies")

# Set the objective function (maximize profit)
m.setObjective(4*F + 5*V, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*F + 7*V <= 400, "Cutting_Machine_Time")
m.addConstr(5*F + 4*V <= 400, "Blending_Machine_Time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of Fruit Smoothies: {F.x}")
    print(f"Number of Vegetable Smoothies: {V.x}")
    print(f"Maximum Profit: ${4*F.x + 5*V.x}")
else:
    print("No optimal solution found.")
```