猴子背香蕉问题
问题描述
有一个猴子,身边有100根香蕉,一次最多背50根,离家50步。它背着香蕉每走一步都会吃掉一根,请问到家时,它最多剩下几根?
个人思路
我觉得要抓住一点,就是如何达到最优:走同样多的路程,每次尽可能地多背,因为少走一趟一定比多走一趟消耗的香蕉少。
于是,问题就成了“什么样的策略下,算是‘多背’、‘少走’呢?”。
对于给出的条件,你想啊,‘多背’肯定是背完50根香蕉对吧;‘少走’的话就依赖于前一次走过的路程,比如这题,如果我一次性走完(50步),那么一点也不剩,如果我走两次,这怎么走呢?别忘了要满足‘多背’的原则,那么第二次我也希望能背50根香蕉!于是,第一次就走25步,100-25*2=50,正好第二次可以背完,且满足‘多背’!。
推广
猴子有x根香蕉,最多背y根,离家z步,求最多香蕉数目?
- x -= x%y;
- 走y/2步(y/2>=z),背y个香蕉,然后折返,重复2直到背完香蕉(第一步要去掉“零头”就是为了防止猴子为了拿少于y/2个香蕉而回不来……);
- 一直重复2,直到到达目的地或者永远到不了。