## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The factory manufactures two types of tools: drills and saws, using two machines: a milling machine and a CNG machine. The goal is to maximize the profit by determining the optimal number of packages of drills and saws to produce.

Let's define the variables:

* $x$: number of packages of drills to produce
* $y$: number of packages of saws to produce

The constraints are:

* Milling machine availability: $20x + 30y \leq 800$
* CNG machine availability: $70x + 90y \leq 800$
* Non-negativity constraints: $x \geq 0, y \geq 0$

The objective function to maximize is:

* Profit: $35x + 100y$

## Gurobi Code

```python
import gurobi

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

    # Define the variables
    x = model.addVar(lb=0, name="drills")
    y = model.addVar(lb=0, name="saws")

    # Define the objective function
    model.setObjective(35 * x + 100 * y, gurobi.GRB.MAXIMIZE)

    # Define the constraints
    model.addConstr(20 * x + 30 * y <= 800, name="milling_machine")
    model.addConstr(70 * x + 90 * y <= 800, name="CNG_machine")

    # Optimize the model
    model.optimize()

    # Print the results
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Drills to produce: {x.varValue}")
        print(f"Saws to produce: {y.varValue}")
        print(f"Maximum profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```