## Problem Description and Formulation

The cosmetics company produces three types of face wash: low, medium, and high quality. Each type has a different composition of rare ingredients and water, and generates a different profit per unit. The goal is to determine the optimal production levels for each type of face wash to maximize profits, given the available amounts of rare ingredients and water.

## Decision Variables

Let \(L\), \(M\), and \(H\) be the number of low, medium, and high quality face washes produced, respectively.

## Objective Function

The profit per low quality face wash is $3, per medium quality face wash is $7, and per high quality face wash is $9. The objective function to maximize profits (\(P\)) is:

\[P = 3L + 7M + 9H\]

## Constraints

1. **Rare Ingredients Constraint**: Each low quality face wash requires 1 unit of rare ingredients, each medium quality face wash requires 3 units, and each high quality face wash requires 4 units. The company has 100 units of rare ingredients available.

\[L + 3M + 4H \leq 100\]

2. **Water Constraint**: Each low quality face wash requires 4 units of water, each medium quality face wash requires 2 units, and each high quality face wash requires 1 unit. The company has 200 units of water available.

\[4L + 2M + H \leq 200\]

3. **Non-Negativity Constraints**: The production levels cannot be negative.

\[L \geq 0, M \geq 0, H \geq 0\]

## Gurobi Code

```python
import gurobi

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

    # Define decision variables
    L = model.addVar(lb=0, name="Low_Quality")
    M = model.addVar(lb=0, name="Medium_Quality")
    H = model.addVar(lb=0, name="High_Quality")

    # Objective function: Maximize profits
    model.setObjective(3*L + 7*M + 9*H, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(L + 3*M + 4*H <= 100, name="Rare_Ingredients")
    model.addConstr(4*L + 2*M + H <= 200, name="Water")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Low Quality Face Wash: {L.varValue}")
        print(f"Medium Quality Face Wash: {M.varValue}")
        print(f"High Quality Face Wash: {H.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_face_wash_problem()
```