To solve this problem, we first need to define the decision variables, the objective function, and the constraints.

Let's denote:
- $x_A$ as the number of Supplement A pills the patient should buy,
- $x_B$ as the number of Supplement B pills the patient should buy.

The objective is to minimize the total cost, which can be represented as:
\[ \text{Minimize} \quad 3.50x_A + 3.80x_B \]

The constraints based on the nutritional requirements are:
- Calcium: $3x_A + 4x_B \geq 25$
- Vitamin A: $2x_A + 1x_B \geq 20$
- Vitamin B: $3x_A + 2x_B \geq 18$

Since the patient cannot buy a negative number of supplements, we also have:
- $x_A \geq 0$
- $x_B \geq 0$

And because the number of supplements must be an integer (you can't buy half a supplement), both $x_A$ and $x_B$ are integers.

Here is how you could represent this problem in Gurobi using Python:

```python
from gurobipy import *

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

# Define the decision variables
x_A = m.addVar(vtype=GRB.INTEGER, name="Supplement_A", lb=0)
x_B = m.addVar(vtype=GRB.INTEGER, name="Supplement_B", lb=0)

# Set the objective function
m.setObjective(3.50*x_A + 3.80*x_B, GRB.MINIMIZE)

# Add constraints
m.addConstr(3*x_A + 4*x_B >= 25, "Calcium_Requirement")
m.addConstr(2*x_A + 1*x_B >= 20, "Vitamin_A_Requirement")
m.addConstr(3*x_A + 2*x_B >= 18, "Vitamin_B_Requirement")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Buy {x_A.x} of Supplement A")
    print(f"Buy {x_B.x} of Supplement B")
    print(f"Total cost: ${3.50*x_A.x + 3.80*x_B.x:.2f}")
else:
    print("No optimal solution found")

```