猴子背香蕉最优解问题的程序实现
2019-03-02 12:53
113 查看
猴子背香蕉最优解问题的程序实现
问题描述:
- 有只猴子在树林采了200根香蕉堆成一堆,猴子家离香蕉堆100米,猴子打算把香蕉背回家, 每次最多能背100根,可是猴子嘴馋,每背一米要吃一根香蕉,问猴子最多能背回家几根香蕉?
个人理解:
- 每走一米都吃一根香蕉,包括往回走
- 肯定是一次携带的越多,往返的次数越少,能省下的香蕉才越多,所以我认为需要两次往返,每次携带100根
- 目前问题就是走几步返回拿剩余的香蕉才能得到最优解的问题
程序分析:
- 假设每走一步回去拿剩余的香蕉,当走1米时剩余99根香蕉,并且需要拿一根香蕉回到起点,即在第一米处留下了98根香蕉
- 当回到起点拿上剩余的100根香蕉后,走到一米的地方还剩99根,加上剩余的香蕉总数为99+98=197根,所以每走一米需要3根香蕉
- 当然你每到一个位置的时候你都可以直接回家,如在1米的位置你可以直接拿100根香蕉直接回家,路程上还需要消耗99根,所以到家还剩1根
程序实现:
为了快速实现我采用的是Go语言实现,其他语言逻辑一样:
/********************************************** ** @Des: monkey - example ** @Author: archerzdip ** @Date: 2019-03-01 23:22 ** @Last Modified time: 2019-03-01 23:22 ***********************************************/ package main import "fmt" func main() { // 距离 distance := 100 // 最优解 bestLeft := 0 // 每次走的步数 for i := 1 ; i <= distance/2 ; i++ { // 总数 total := 200 // 剩余 left := 0 // 走到第几步 for j := i ; j <= distance ; j += i { leftStep := 100 - j if total > 0 { total -= i*3 } if total > distance { left = 100 - leftStep } else { left = total - leftStep } if left > bestLeft { bestLeft = left } if total < 0 || left < 0 { break } fmt.Printf("每次走%d步,当走到第%d步时,还剩香蕉%d根,距离终点还剩%d米,走到终点还剩%d根。\n", i,j,total,leftStep,left) } } fmt.Printf("最优解为:%d根",bestLeft) }
结果:
最优解为:33根
从结果中可以看出每走1米回去取剩余的,当走到33米的时候直接回去可剩余33根;每次走33米当走到33米的时候拿上100根直接回去也可剩余33根,所以33根为最优解。
可能问题
- 目前想到的逻辑为这样,若逻辑错误则程序肯定不对
- 该程序没实现我第一次走1米,下一次走其他米数的情况,但我觉得结果应该相同
- 目前正在学习Go,可能没能体现出Go的优势
反馈
该逻辑是我自己的理解,可能有问题欢迎指正。 感谢!!!
相关文章推荐
- 猴子背100根香蕉问题程序实现
- 一个猴子选大王问题程序(c++实现)
- 5个猴子摘桃子的问题程序实现
- 哲学家就餐问题在 linux 上的程序实现
- 程序终于实现跨机器运行——记VC++2005程序开发的一个常见问题
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
- [导入]编写程序实现约瑟夫(Josephu)问题(C)
- 猴子和香蕉问题
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
- 【项目总结(一)】---视频摘要matlab的程序实现几个问题的总结
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)收藏
- CSDN博客:对于一个程序员,写程序就是实现功能,遇到具体问题,解决这个问题,并记录问题到CSDN上,从而有所提高和互相帮助。
- 杯子倒水问题自动求解程序(Javascript实现)
- 中国象棋程序的设计与实现(十一)--第2次回答CSDN读者的一些问题
- 对ChiMerge问题的解析与程序实现(matlab)
- C语言实现猴子选大王(约瑟夫问题)
- php实现猴子选大王问题算法实例
- 从易到难编写C++程序,(5)问题:实现满足各种需求的随机整数生成类RandCreater
- 问题的提出:如何在Windows上通过终端程序实现Unix平台的前台编译?