To solve this linear programming optimization problem, we first need to define the decision variables and the objective function. Let's denote:

- \(x\) as the number of newcomers (earning $400 a week),
- \(y\) as the number of full-time employees (earning $700 a week).

The objective is to minimize the total wage bill, which can be represented as \(400x + 700y\).

We have several constraints based on the problem description:

1. The company needs at least 100 gardeners in total: \(x + y \geq 100\).
2. At least 40 of the gardeners must be full-time employees: \(y \geq 40\).
3. The number of full-time employees should be at least half the number of newcomers: \(y \geq 0.5x\).

Now, let's formulate this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Gardening_Company_Optimization")

# Define the decision variables
x = m.addVar(name="newcomers", lb=0)  # Number of newcomers
y = m.addVar(name="full_time_employees", lb=0)  # Number of full-time employees

# Set the objective function: minimize the total wage bill
m.setObjective(400*x + 700*y, GRB.MINIMIZE)

# Add constraints
m.addConstr(x + y >= 100, name="total_gardeners")  # Total gardeners should be at least 100
m.addConstr(y >= 40, name="min_full_time_employees")  # At least 40 full-time employees
m.addConstr(y >= 0.5*x, name="supervision_ratio")  # Supervision ratio

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Newcomers: {x.x}")
    print(f"Full-time employees: {y.x}")
    print(f"Total wage bill: ${400*x.x + 700*y.x:.2f}")
else:
    print("No optimal solution found")
```