## Problem Description and Formulation

The gift store needs to send out gifts using either the postal service or by hiring vans. The postal service can take 100 gifts per pickup at a cost of $50 per pickup, while vans can take 80 gifts each at a cost of $40 per van. The number of vans cannot exceed the number of postal service pickups, and the store has a budget of $1000.

## Decision Variables

Let \(P\) be the number of postal service pickups and \(V\) be the number of vans hired.

## Objective Function

The objective is to maximize the total number of gifts sent, which is \(100P + 80V\).

## Constraints

1. **Budget Constraint**: The total cost must not exceed $1000. The cost for postal service pickups is $50\(P\) and for vans is $40\(V\), so we have \(50P + 40V \leq 1000\).
2. **Vans vs. Postal Service Constraint**: The number of vans cannot exceed the number of postal service pickups, so \(V \leq P\).
3. **Non-Negativity Constraint**: Both \(P\) and \(V\) must be non-negative integers, so \(P \geq 0\) and \(V \geq 0\).

## Gurobi Code

```python
import gurobi

def solve_gift_distribution():
    # Create a new model
    model = gurobi.Model()

    # Define decision variables
    P = model.addVar(name="P", vtype=gurobi.GRB.INTEGER, lb=0)  # Number of postal service pickups
    V = model.addVar(name="V", vtype=gurobi.GRB.INTEGER, lb=0)  # Number of vans

    # Objective function: Maximize the total number of gifts sent
    model.setObjective(100 * P + 80 * V, gurobi.GRB.MAXIMIZE)

    # Budget constraint: 50P + 40V <= 1000
    model.addConstraint(50 * P + 40 * V <= 1000, name="budget_constraint")

    # Vans cannot exceed postal service pickups: V <= P
    model.addConstraint(V <= P, name="vans_vs_postal")

    # Solve the model
    model.optimize()

    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution: P = {P.varValue}, V = {V.varValue}")
        print(f"Maximum gifts sent: {100 * P.varValue + 80 * V.varValue}")
    elif model.status == gurobi.GRB.INFEASIBLE:
        print("The problem is infeasible.")
    else:
        print("The model status is not optimal or infeasible.")

solve_gift_distribution()
```