## Problem Description and Formulation

The problem requires finding the optimal blend of two paints, cheap and expensive, to achieve a quality rating of at least 80 while minimizing the cost. The cheap paint has a quality rating of 50 and costs $0.30 per liter, while the expensive paint has a quality rating of 90 and costs $1.50 per liter.

Let's define the decision variables:

* $x$ be the fraction of each liter that is cheap paint
* $y$ be the fraction that is expensive paint

The objective is to minimize the cost, which can be represented as:

Minimize $0.30x + 1.50y$

Subject to the following constraints:

* The quality rating of the mix must be at least 80: $50x + 90y \geq 80$
* The fractions of cheap and expensive paints must add up to 1: $x + y = 1$
* The fractions of cheap and expensive paints must be non-negative: $x \geq 0, y \geq 0$

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    x = model.addVar(name="cheap_paint", lb=0, ub=1)
    y = model.addVar(name="expensive_paint", lb=0, ub=1)

    # Define the objective function
    model.setObjective(0.30 * x + 1.50 * y, gurobi.GRB.MINIMIZE)

    # Add the quality rating constraint
    model.addConstr(50 * x + 90 * y >= 80, name="quality_rating")

    # Add the constraint that the fractions add up to 1
    model.addConstr(x + y == 1, name="fractions_add_up_to_1")

    # Optimize the model
    model.optimize()

    # Check if the model is infeasible
    if model.status == gurobi.GRB.Status.INFEASIBLE:
        print("The problem is infeasible")
        return

    # Print the solution
    print("Optimal blend:")
    print(f"Cheap paint: {x.varValue:.4f}")
    print(f"Expensive paint: {y.varValue:.4f}")
    print(f"Cost: {model.objVal:.4f}")

solve_paint_blend_problem()
```