算法学习-【转】火车运煤算法--全面解析
2016-04-11 18:24
302 查看
程老师原文地址:http://flychao88.iteye.com/blog/2187854原文如下:你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大――每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市? 这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒。如果你的火车可以全部装下,到目的地也会被全部烧光,一丁点也不剩。所以,很多人的第一反应都是觉得这个不太可能。 思考答题是:装1000吨煤,走250公里,扔下500吨煤,回矿山。
装1000吨煤,走到250公里处,拿起250吨煤继续向前到500公里处,扔下500吨煤,回矿山。此时火车上还有250吨,再加上在250公里处还有250吨煤,所以,火车是可以回矿山的。
装上最后1000吨煤,走到500公里处,装上那里的500吨煤,然后一直走到目的。
***********************原文结束,学习笔记开始****************************看完觉得挺有意思的,其实是挺虐心的。写个程序跑跑吧,求最优值嘛。分析下题目,包含的条件就是分段卸载,暗含的条件就是火车最后一次可以不返回。按照上面的分析,要出发三次,返回两次。分别设两点为x,第二点距离第一点为y.也就是第一次卸载点,经历5次,消耗一车煤。5x=1000.所以x=200.到达200公里后,还剩下2车煤。3y=1000,y=333.3。剩余煤炭=1000-(1000-533)=533按着推理。就是一车煤消耗完最终距离。(1)火车拉1000吨到某一个点,在返回拉剩下的煤到之前的点,一直到拉完全部的煤到该点。(2)到新的点之后,那么剩下的距离和剩下的煤又可以递归使用(1)中的方法。(3) 到所剩的煤不足1000吨(也就是火车一次能全不运走)的时候就一次运完,那么减掉路上的消耗就是最后剩下的到B点的煤。用递归方法可以实现此数学模型,我自己按照理解demo如下:
装1000吨煤,走到250公里处,拿起250吨煤继续向前到500公里处,扔下500吨煤,回矿山。此时火车上还有250吨,再加上在250公里处还有250吨煤,所以,火车是可以回矿山的。
装上最后1000吨煤,走到500公里处,装上那里的500吨煤,然后一直走到目的。
***********************原文结束,学习笔记开始****************************看完觉得挺有意思的,其实是挺虐心的。写个程序跑跑吧,求最优值嘛。分析下题目,包含的条件就是分段卸载,暗含的条件就是火车最后一次可以不返回。按照上面的分析,要出发三次,返回两次。分别设两点为x,第二点距离第一点为y.也就是第一次卸载点,经历5次,消耗一车煤。5x=1000.所以x=200.到达200公里后,还剩下2车煤。3y=1000,y=333.3。剩余煤炭=1000-(1000-533)=533按着推理。就是一车煤消耗完最终距离。(1)火车拉1000吨到某一个点,在返回拉剩下的煤到之前的点,一直到拉完全部的煤到该点。(2)到新的点之后,那么剩下的距离和剩下的煤又可以递归使用(1)中的方法。(3) 到所剩的煤不足1000吨(也就是火车一次能全不运走)的时候就一次运完,那么减掉路上的消耗就是最后剩下的到B点的煤。用递归方法可以实现此数学模型,我自己按照理解demo如下:
![](http://img2.ph.126.net/r47bdSSUdQnyf_uIeM9kCQ==/4945515340906792070.png)
相关文章推荐
- java学习-【转】NIO 水平触发,边缘触发的区别
- java学习-【转】Java常见内存溢出异常分析
- 【转】负载均衡的基本算法
- java学习-【转】什么是Reactor模式,或者叫反应器模式
- Python变量与数据类型
- 关于ListView的getItemViewType()这个方法的踩坑叙述
- 笔试题21 . LeetCode OJ (8)
- 京东VS猫宁,运费或将成为压垮京东的最后一根稻草
- SQL Server 用户名sa登陆出错
- git常用命令
- java学习-【转】【经验总结】NIO常见的陷阱解析
- java学习-【转】32位jvm还是64位jvm?
- java学习-【转】JAVA 线程池源码分析
- java学习-【转】如何用Java编写一段代码引发内存泄露
- java学习-【转】SharedHashMap是更低延迟无GC暂停的Map实现
- java并发:AbstractQueuedSynchronizer的介绍和原理分析
- java学习-【转】java UncaughtExceptionHandler 处理线程意外中止
- 【转】细数JDK里的设计模式
- java学习-【转】JAVA并发类名图
- 缓存学习-【转】缓存淘汰算法--LRU算法