你是山西的一個(gè)煤老板,你在礦區(qū)開(kāi)采了有3000噸煤需要運(yùn)送到市場(chǎng)上去賣,從你的礦區(qū)到市場(chǎng)有1000公里,你手里有一列燒煤的火車,這個(gè)火車最多只能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請(qǐng)問(wèn),作為一個(gè)懂編程的煤老板的你,你會(huì)怎么運(yùn)送才能運(yùn)最多的煤到集市?
火車運(yùn)行時(shí),最好讓他滿載,起始點(diǎn)記為A
第一步,分三次把煤運(yùn)送到中間點(diǎn)B
第二步,分兩次把煤運(yùn)送到中間點(diǎn)C
第三步,把煤運(yùn)送到目的地D
第一步:5*(AB) = 1000;解得AB=200
第二步:3*BC = 1000;解得BC=333.
第三步:AB+BC+CD=1000;解得CD=467
因此,做多運(yùn)送533噸煤到目的地
假定從A到B需要2m+1次,距離為x,那么運(yùn)過(guò)去消耗(2m+1)x的煤。一開(kāi)始的時(shí)候必須(m+1)>=3才可以把煤運(yùn)完,而且空載是沒(méi)有哦效率的,所以(m+1)<4.
所以m=2,而m=1是,所剩煤為2000,m=0時(shí),所剩煤為1000.由m值可以得到距離x,和9樓一樣。
同時(shí),在m不變的情況下,可以任意分段,比如m=2是,可以把煤運(yùn)到50處,然后在運(yùn)到100處,然后再運(yùn)到200處,由于m都是等于2,所以到200時(shí),總會(huì)剩下2000煤。
所以實(shí)際上解有無(wú)群多,只要讓煤在200,533的地方重新聚集就行了。
首先,要獲得最大值,必須在最遠(yuǎn)的中間”補(bǔ)給點(diǎn)”放下等同其路程的煤作為補(bǔ)給。所以接下來(lái)要做的就是,如何讓2000噸煤放到最遠(yuǎn)的地方,同時(shí)留下“補(bǔ)給煤”。因?yàn)闂l件限制,所以只能分兩次達(dá)成上面的目標(biāo),第一個(gè)補(bǔ)給點(diǎn),他要消耗的是他路程的5倍的煤,因?yàn)樗约合膬纱危诙嗡兔旱南膬纱危詈笠淮沃边_(dá)終點(diǎn)的要消耗一次。所以他要在1/5的地方放下,第一個(gè)點(diǎn)已經(jīng)提供補(bǔ)給,所以第二點(diǎn)要補(bǔ)給3次,他自己兩次,最后直達(dá)的一次。所以是在200+333的地方放下333.所以最后到達(dá)的,應(yīng)該是200+333 = 533. 總數(shù)是其他值也可以推導(dǎo)出來(lái)了
編程的例子就是:
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);
}