## Problem Description and Formulation

The problem is a classic example of a linear programming problem. Jake and Jill want to maximize their profit by producing the optimal number of batches of donuts and cookies given the time constraints.

Let's define the decision variables:
- \(D\): Number of batches of donuts
- \(C\): Number of batches of cookies

The objective function to maximize profit (\(P\)) is:
\[ P = 20D + 15C \]

The constraints based on the time available for Jake (\(J\)) and Jill (\(L\)) are:
- Jake's time: \(20D + 5C \leq 200\)
- Jill's time: \(10D + 25C \leq 300\)
- Non-negativity: \(D \geq 0, C \geq 0\)

## Gurobi Code

To solve this problem using Gurobi in Python, we will first install the gurobi package if it's not already installed. You can install it via pip:

```bash
pip install gurobi
```

Now, let's write the Gurobi code:

```python
import gurobi as gp

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

# Define the variables
D = model.addVar(name="Donuts", lb=0, vtype=gp.GRB.CONTINUOUS)
C = model.addVar(name="Cookies", lb=0, vtype=gp.GRB.CONTINUOUS)

# Define the objective function
model.setObjective(20 * D + 15 * C, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(20 * D + 5 * C <= 200, name="Jake_Time")
model.addConstr(10 * D + 25 * C <= 300, name="Jill_Time")

# Optimize the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal batches of donuts: {D.varValue}")
    print(f"Optimal batches of cookies: {C.varValue}")
    print(f"Maximum profit: ${model.objVal:.2f}")
else:
    print("The model is infeasible.")
```