To solve Amanda's problem, we need to maximize her profit given the constraints on land, budget, and maintenance hours. Let's denote the number of acres for apple trees as \(A\) and for peach trees as \(P\). The objective function to maximize is the total profit from both types of trees.

Given:
- Profit per acre of apples: $15
- Profit per acre of peaches: $25
- Cost per sapling of an apple tree: $50
- Cost per sapling of a peach tree: $80
- Maintenance time per acre for apples: 3 hours
- Maintenance time per acre for peaches: 5 hours
- Total land available: 4000 acres
- Budget for saplings: $30,000
- Total maintenance hours available: 600 hours

We can formulate the problem as follows:
1. Objective Function: Maximize \(15A + 25P\)
2. Constraints:
   - Land constraint: \(A + P \leq 4000\)
   - Budget constraint: \(50A + 80P \leq 30000\)
   - Maintenance hours constraint: \(3A + 5P \leq 600\)
   - Non-negativity constraints: \(A \geq 0, P \geq 0\)

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

```python
from gurobipy import *

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

# Define variables
A = m.addVar(vtype=GRB.CONTINUOUS, name="Apple_Acres", lb=0)
P = m.addVar(vtype=GRB.CONTINUOUS, name="Peach_Acres", lb=0)

# Set the objective function
m.setObjective(15*A + 25*P, GRB.MAXIMIZE)

# Add constraints
m.addConstr(A + P <= 4000, "Land_Constraint")
m.addConstr(50*A + 80*P <= 30000, "Budget_Constraint")
m.addConstr(3*A + 5*P <= 600, "Maintenance_Hours_Constraint")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Apple Acres: {A.x}")
    print(f"Peach Acres: {P.x}")
    print(f"Total Profit: {m.objVal}")
else:
    print("No optimal solution found")
```