Problem (Fine 1947, Phipps 1947). A jeep holds 1 unit of fuel and drives 1 unit of distance per unit of fuel. At the base there are units. The jeep may leave fuel in depots anywhere along its way and pick it up later. How far into the desert can it get (exploration: one way), and how far can it get and still come back (round trip)?

VariantMaximum distance with unitsGrowth
one way (exploration, “desert crossing”)
round trip (back to base)
fractional fuel , add (one way) or (round trip)
fuel needed for distance exponential in : about up to a constant factor
1234510
one way11.3331.5331.6761.7872.133
round trip0.50.750.9171.0421.1421.464

Plan (one way). Work backwards from the end: with units at a depot, move them all forward by using trips forward and trips back ( traversals, one unit burnt), arriving with units; finally drive the last full tank 1 unit.

double jeepOneWay(double f) {                        // f >= 1 units of fuel
    int n = int(f); double r = f - n, d = r / (2 * n + 1);
    for (int k = 1; k <= n; k++) d += 1.0 / (2 * k - 1);
    return d;
}
double jeepRoundTrip(double f) {
    int n = int(f); double r = f - n, d = r / (2 * n + 2);
    for (int k = 1; k <= n; k++) d += 1.0 / (2 * k);
    return d;
}
 
// Simulate the one-way plan for integer n, checking tank and depot accounting. Returns the distance reached.
double simulateJeep(int n) {
    double pos = 0, depot = n;                       // all remaining fuel sits at the current depot
    for (int k = n; k >= 2; k--) {
        double step = 1.0 / (2 * k - 1), next = 0;
        for (int trip = 1; trip <= k; trip++) {
            double take = min(1.0, depot); depot -= take;   // fill the tank (capacity 1)
            double tank = take - step;               // drive forward
            assert(tank >= -1e-12);
            if (trip < k) { double drop = tank - step; assert(drop >= -1e-12); next += drop; }   // keep just enough to drive back
            else next += tank;                       // last trip: stay at the new depot with everything
        }
        assert(depot < 1e-9); pos += step; depot = next;
        assert(fabs(depot - (k - 1)) < 1e-9);
    }
    return pos + min(1.0, depot);                    // final full tank
}