## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a gift wrapping kiosk by determining the optimal number of small and large gifts to wrap, given the available worker time and wrapping paper.

Let's define the decision variables:

* `x`: number of small gifts to wrap
* `y`: number of large gifts to wrap

The objective function is to maximize the profit:

* Profit per small gift: $3
* Profit per large gift: $5
* Total profit: `3x + 5y`

The constraints are:

* Worker time: 10 minutes per small gift, 15 minutes per large gift, and 720 minutes available
* `10x + 15y <= 720`
* Wrapping paper: 2 units per small gift, 3 units per large gift, and 150 units available
* `2x + 3y <= 150`
* Non-negativity constraints: `x >= 0`, `y >= 0`

## Gurobi Code

```python
import gurobi

# Create a new Gurobi model
m = gurobi.Model()

# Define the decision variables
x = m.addVar(lb=0, name="small_gifts")
y = m.addVar(lb=0, name="large_gifts")

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

# Define the constraints
worker_time_constraint = m.addConstr(10*x + 15*y <= 720, name="worker_time")
wrapping_paper_constraint = m.addConstr(2*x + 3*y <= 150, name="wrapping_paper")

# Optimize the model
m.optimize()

# Print the solution
if m.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of small gifts: {x.varValue}")
    print(f"Number of large gifts: {y.varValue}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found.")
```