关于火车运煤的一些想法

来源:互联网 发布:苹果mac能玩什么游戏 编辑:程序博客网 时间:2024/04/30 06:34

火车运煤也是个经典的问题了。它的定义如下:

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?


很多人都知道结果是533.3333。但是这个结果是怎么算出来的,当有4000,或者5000吨煤要运的时候,结果又是多少?这是我这篇博客想讲的东西。

我的解决思路:

想要运最多的煤到集市,很明显这是个贪心算法的问题。它的问题部分是运煤到集市,贪心的部分是运最多的煤。

由于贪心算法的原理,每一个子问题都要是最优的。那么,由于这个火车最多只能装1000吨煤,且每一公里需要耗一吨煤,那么当火车消耗完1000吨煤之后,它对整个问题的贡献是什么?由于消耗了1000吨煤,还剩下了2000吨煤。那么消耗了1000吨煤对问题最大的贡献是把这剩下的2000吨煤整体向前移动了多少公里?这就是一个子问题。

接下来的就很简单了,假设消耗了1000吨,剩下的2000吨整体向前移动了x公里。整个问题就变成了将2000吨煤再运送1000-x公里的距离。那么再消耗1000吨,剩下的1000吨又整体向前移动了y公里。这个时候,只剩下1000吨煤了,火车离集市还有1000-x-y公里。还在想什么,火车直接拉着最后的1000吨煤开向集市吧。

这样,问题就转化成了求x,y的值。这相对就很简单了。

先求x,想象这样一个画面,火车从起点拉了1000吨煤走到了A点,消耗了x吨煤,然后将1000-2x吨煤放下,带着x吨煤往回走,回到起点时,煤正好烧完了,火车变成空的了。再为火车装上1000吨煤,重复上述过程。最大的问题就是这个过程重复了几次?仔细看上述过程就知道,每次火车都要在起点装1000吨煤,总共就3000吨煤,所以火车最多有三次在起点。所以火车有3次从起点到A点,2次从A点到起点。所以x=1000/(3+2)。求出x=200

同理,y=1000/(2+1)。

所以火车最后到达终点时候剩余的煤就等于1000-(1000-x-y)=x+y=533.3333


当要运4000,5000吨煤的时候,很简单,照着上面的思路再算一遍吧。

0 0
原创粉丝点击