Here's the formulation of the linear program and the Gurobi code to solve it:

**Decision Variables:**

* `x`: Acres of solar panels to build
* `y`: Acres of windmills to build

**Objective Function:**

Maximize total savings: `500x + 1000y`

**Constraints:**

* **Land Constraint:** `x + y <= 120` (Total acres cannot exceed 120)
* **Resource Constraint:** `20x + 40y <= 2000` (Total resources used cannot exceed 2000)
* **Non-negativity Constraints:** `x >= 0`, `y >= 0` (Cannot build negative acres)


```python
import gurobipy as gp

# Create a new model
m = gp.Model("Resource Allocation")

# Create decision variables
x = m.addVar(lb=0, name="solar_acres")  # Acres of solar panels
y = m.addVar(lb=0, name="windmill_acres") # Acres of windmills

# Set objective function
m.setObjective(500*x + 1000*y, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(x + y <= 120, "land_constraint")
m.addConstr(20*x + 40*y <= 2000, "resource_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution Found:")
    print(f"  Solar Panels Acres: {x.x}")
    print(f"  Windmill Acres: {y.x}")
    print(f"  Total Savings: ${m.objVal}")
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization terminated with status {m.status}")

```
