题目如下:
一辆载油500升的汽车从A开往1000公里外的B,已知汽车每公里耗油量为1升,A处有无穷多的油,其他任何地点都没有油,但该车可以在任何地点存放油以备中转,问从A到B最少需要多少油。
这个题想了好多天也没想出来,在网上找答案也都是基本相同的,只给出了一个结论,而没有一个详细推导过程。今天没事在家仔细的推导了一下,终于有些眉目了。记录如下:
由最少耗油的要求,先得有几个前提:
1.汽车到达终点时油箱是空的。
2.路上的每一个中转点都没有剩下油。
现在画一个数轴,代表起点到终点的路径,在这个数轴上取m个点,分别记为X(1),X(2),...,X(m)。X(i)表示第i个点到终点的距离。1号点为起点,m号点为终点。所以有X(1)=0,X(m)=1000。设汽车油箱的容量为A,由题目可知A=500。设S(i)表示在第i最少存放多少升油,那么显然S(m)=0,而我们要求的就是S(0)。再设n(i)为从第i-1点到第i点需要的往返次数(注意,一去一回代表一次往返)。好,以上就是需要定义的一些符号,下面开始推导过程:
从i-1点往i点运油时,最节省的情况是从i-1点出发时应该油箱装满油,然后在i点放下油后回到i-1点时油箱是空的,这时候运油的效率是最高的。所以有:
S(i) = A - [X(i)-X(i-1)] + {A - 2*[X(i) - X(i-1)]}*n(i)。
上式中A - [X(i)-X(i-1)]是最后一次从i-1点到i点油箱中剩下的油;{A - 2*[X(i) - X(i-1)]}*n(i)表示在n(i)次往返过程中总共在i点存下的油。把上式化简合并一下得到式(1):
S(i) = [n(i) + 1]*A - [2*n(i) + 1]*[X(i) - X(i-1)] -----(1)
又因为到第i点存下的油等于第i-1点存下的油减去从i-1点到i点的总损耗,而从i-1点到i点的总损耗为[2*n(i) + 1]*[X(i) - X(i-1)],所以有下式:
S(i) = S(i-1) - [2*n(i) + 1]*[X(i) - X(i-1)]。
把(1)式带入上式则可得到式(2-1):
S(i-1) = [n(i) + 1]*A -----(2-1)
同理有式(2-2)
S(i) = [n(i+1) + 1]*A -----(2-2)
用(2-1)减去(2-2)得到式(3):
S(i-1) - S(i) = [n(i) - n(i+1)]*A -----(3)
因为S(i-1) - S(i)表示的是从i-1点到i点的总损耗,而A是固定值,所以由(3)式得知,要使总损耗最小,就需要n(i) - n(i+1)最小,因为S(i-1) - S(i)必然>0,所以n(i) - n(i+1)>0,且n[i]是整数,所以就有min([n(i) - n(i+1)]) = 1。所以有式(4):
n(i) - n(i+1)= 1 ==> n(i) = n(i+1) + 1 -----(4)
把式(4)代入式(2-2)就得到式(5):
S(i) = n(i)*A -----(5)
再把式(5)代入式(1)并化简就可以得到式(6):
X(i) - X(i-1) = A/[2*n(i) + 1] -----(6)
X(i) - X(i-1)表示的相邻两点之间的距离,所以显然要达到终点的话就必须有:
又因为n(m)=0,即从最后一个中转点到终点是不需要往返的。再由式(4)就有:n(m-1) = 1,n(m-2) = 2, …,即有n(i) = m-i成立。我们从终点往起点回退,再由上式就有:
所以求出来m=8。但是m=8时,求出来的和 约等于1010.9比1000大,所以不能由式(5)直接算S(0),而应该先算S(1) = (m-1)*A = (8-1)*500 = 3500升。也就是说在第一个中转点应该要存3500升油。然后再算从第0点到第1点的损耗,由前面的计算我们可以得到X(1) = 1000 – (500 + 500/3 + 500/5 + 500/7 + 500/9 + 500/11 + 500/13) ≈ 22.433米。
所以从第0点到第1点的总耗损可以由前面的总损耗公式[2*n(i) + 1]*[X(i) - X(i-1)]求出:
[2*n(1) + 1]*(22.433 - 0) = (2*7 + 1)*22.433 = 336.495
所以总耗油量就约为 3500 + 336.495 = 3836.495升。
Reprint from:http://blog.csdn.net/bad_sheep/article/details/5830013