你是山西的一個煤老板,你在礦區開采了有3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手里有一列燒煤的火車,這個火車最多只能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請問,作為一個懂編程的煤老板的你,你會怎么運送才能運最多的煤到集市?

火車運行時,最好讓他滿載,起始點記為A
第一步,分三次把煤運送到中間點B
第二步,分兩次把煤運送到中間點C
第三步,把煤運送到目的地D
第一步:5*(AB) = 1000;解得AB=200
第二步:3*BC = 1000;解得BC=333.
第三步:AB+BC+CD=1000;解得CD=467
因此,做多運送533噸煤到目的地

假定從A到B需要2m+1次,距離為x,那么運過去消耗(2m+1)x的煤。一開始的時候必須(m+1)>=3才可以把煤運完,而且空載是沒有哦效率的,所以(m+1)<4.
所以m=2,而m=1是,所剩煤為2000,m=0時,所剩煤為1000.由m值可以得到距離x,和9樓一樣。
同時,在m不變的情況下,可以任意分段,比如m=2是,可以把煤運到50處,然后在運到100處,然后再運到200處,由于m都是等于2,所以到200時,總會剩下2000煤。
所以實際上解有無群多,只要讓煤在200,533的地方重新聚集就行了。

首先,要獲得最大值,必須在最遠的中間”補給點”放下等同其路程的煤作為補給。所以接下來要做的就是,如何讓2000噸煤放到最遠的地方,同時留下“補給煤”。因為條件限制,所以只能分兩次達成上面的目標,第一個補給點,他要消耗的是他路程的5倍的煤,因為他自己消耗兩次,第二次送煤的消耗兩次,最后一次直達終點的要消耗一次。所以他要在1/5的地方放下,第一個點已經提供補給,所以第二點要補給3次,他自己兩次,最后直達的一次。所以是在200+333的地方放下333.所以最后到達的,應該是200+333 = 533. 總數是其他值也可以推導出來了
編程的例子就是:

int sum = 3000;
int load_num = 1000;

int result = 0;
int time = sum / load_num – 1;
for (int i = time; i > 0 ; –i) {
result += load_num / ((i*2) + 1);
}