## Problem Description and Formulation

The problem is a classic example of a linear programming problem. Bob Fashion produces two types of lipsticks: cream lipsticks and matte lipsticks, with profits of $70 and $100 per unit, respectively. The production of each type of lipstick requires a certain amount of time for raw materials preparation, mixing, and packing. The goal is to determine the optimal number of each type of lipstick to produce in order to maximize the total monthly profit, given the constraints on the available time for each production stage.

## Decision Variables

Let \(C\) be the number of cream lipsticks produced and \(M\) be the number of matte lipsticks produced.

## Objective Function

The objective is to maximize the total profit:
\[ \text{Maximize:} \quad 70C + 100M \]

## Constraints

1. Raw materials preparation: \( 3.5C + 5M \leq 300 \)
2. Mixing: \( 5C + 3M \leq 400 \)
3. Packing: \( 2C + 1.5M \leq 200 \)
4. Non-negativity: \( C \geq 0, M \geq 0 \)

## Gurobi Code

```python
import gurobi

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

    # Decision variables
    C = model.addVar(lb=0, name="Cream_Lipsticks")
    M = model.addVar(lb=0, name="Matte_Lipsticks")

    # Objective function
    model.setObjective(70*C + 100*M, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(3.5*C + 5*M <= 300, name="Raw_Materials")
    model.addConstr(5*C + 3*M <= 400, name="Mixing")
    model.addConstr(2*C + 1.5*M <= 200, name="Packing")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal production levels: Cream Lipsticks = {C.varValue}, Matte Lipsticks = {M.varValue}")
        print(f"Maximum profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

if __name__ == "__main__":
    solve_lipstick_production()
```