To solve this optimization problem, we will first define the decision variables and the objective function. Let's denote the number of bottles of strawberry jam as \(x\) and the number of bottles of peach jam as \(y\). The profit per bottle of strawberry jam is $3, and the profit per bottle of peach jam is $5. Thus, the total profit can be represented by the objective function: \(3x + 5y\).

The constraints are as follows:
1. Time constraint: It takes 20 minutes to make one bottle of strawberry jam and 30 minutes to make one bottle of peach jam. The business operates for 3500 minutes per week. This gives us the constraint \(20x + 30y \leq 3500\).
2. Fruit availability constraints:
   - For strawberry jam: \(x \leq 100\)
   - For peach jam: \(y \leq 80\)

Additionally, \(x\) and \(y\) must be non-negative since they represent the number of bottles.

The goal is to maximize the profit, which means we want to find the values of \(x\) and \(y\) that make \(3x + 5y\) as large as possible while still satisfying all the constraints.

Here's how this problem can be represented in Gurobi Python code:

```python
from gurobipy import *

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

# Define variables
x = m.addVar(lb=0, name="strawberry_jam")
y = m.addVar(lb=0, name="peach_jam")

# Define constraints
m.addConstr(20*x + 30*y <= 3500, name="time_constraint")
m.addConstr(x <= 100, name="strawberry_availability")
m.addConstr(y <= 80, name="peach_availability")

# Define the objective function
m.setObjective(3*x + 5*y, GRB.MAXIMIZE)

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: x = {x.x}, y = {y.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```