1. 程式人生 > >火車運煤,驢子吃蘿蔔,駱駝吃香蕉

火車運煤,驢子吃蘿蔔,駱駝吃香蕉

火車運煤問題(可參見原帖),你是山西煤老闆,你開採了3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手裡有一列燒煤的火車,這個火車最多隻能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請問,作為一個懂程式設計的煤老闆的你,你會怎麼運送才能運最多的煤到集市?

這個題的其他形式為,驢子吃蘿蔔,駱駝吃香蕉,而我的問題是,如果你想運1000噸煤到集市,最少需要初始多少噸煤?

這個題的解答並不難,有很多網友都給出了答案,但是想說清楚道理還是比較繞彎。如果想做程式設計做模擬,程式碼很簡單,但是有一些邊界條件、約束條件、中間過程也很繞,所以把這個不是程式設計題的程式設計題放在這裡解答一下,供參考。

根據題意可知有三種運輸方式,分別是往返兩次加一次單程,成本為5;往返一次加一次單程,成本為3;一次單程,成本為1. 下面簡稱T5,T3,T1.   首先給出最優策略1:用完所有能源
,也就是運到終點的能源 + 路上消耗的能源=3000。否則,不論剩餘多少能量,我們總可以後退一點,再多裝一些,把剩餘能量的中的一部分送到終點。
下面引入運輸能力這個概念:
以T3舉例,從起點向終點方向走2趟,最大可裝載2000,運到距離為delta的某點之後,最大剩餘2000-delta,因此稱T3的運輸能力C3 = 2000-delta <= 2000,(delta >= 0)。也就是說,T3最多能運送不超過2000的能量,超過2000就有剩餘能量. 同理T5的運輸能力C5 = 3000-delta <= 3000,T1的運輸能力C1 = 1000 - delta <= 1000.
這樣,我們就得出最優策略2:在運輸能力範圍內,選用成本最低的方式
。用R表示剩餘未被運輸的能量,由策略1和策略2可知,最優的運送方式為: 當2000 <= R <= 3000時, 採用T5方式; 當1000 <= R <= 2000時, 採用T3方式; 當0 <= R <= 1000時, 採用T1方式。 即,先用T5消耗1000,剩餘2000之後用T3方式再消耗1000,最後用T1方式運輸餘下能量。因此最優解為: T5: 運輸距離 x = 1000/5 = 200 T3: 運輸距離 y = 1000/3 = 333.333 T1: 運輸距離 z =1000 - x - y = 466.667 運送到終點的最大能量 = 1000 - 466.667 = 533.333
證畢.
近一步推廣: 首先簡化上面的計算過程:   最大能量 = 1000 - z = 1000 - (1000 - x - y) = x + y = 1000 * (1/3 + 1/5). 現在有初始能量X(假設X可被1000整除,否則可以同理做推廣),按照最優策略1和2可得: 因為,最大需要的運輸能力的方式Tmax=X/1000 * 2 - 1 所以,能夠運輸的最大能量 = 1000 * (1/3 + 1/5 + ... + 1/Tmax)
用歸納法很容易證明此結論。
因為1/3+1/5+1/7+...是發散的,所以理論上可以運送任意初始能源X,但是考慮到單程最大能力為1000,只要X比1000多一點,就可以用T3方式先運送一點,再用T1運送剩餘,因此,約束條件為X > 1000.
最後提個問題,如果希望能夠賣到集市上1000噸煤,那麼最少需要初始有多少噸?
你才山西煤老闆!!!