猴子喫香蕉過河問題分析與擴展

第一次接觸這個題目是大學找工作時候的一次筆試,題幹意思是說有一座橋長50m,橋的一端放着一堆香蕉總共100根,還有一隻猴子,這隻猴子想要過橋,但是每走1m就要喫一根香蕉(每移動1m要喫一根香蕉,否則餓死,就是這麼矯情),並且猴子身上最多可以放50根香蕉,再多就被壓死了。問:猴子最多可以把多少根香蕉搬到橋的另一端?

乍一看覺得不太科學,覺得猴子搬不過去,搬過去數量爲0,仔細考慮,猴子是可以往返搬運的。

可以分爲2個階段:

1:第一階段是往返搬香蕉,儘可能多的把香蕉往前挪動,假設猴子先搬50根香蕉走x米,這時候身上剩下50-x根,考慮回去路上喫的,還需要x根,所以可以在x米處丟掉香蕉50-2x根,然後返回,剛好走回去,再帶50根,往前走,走到x米處又消耗x根,這時候需要一個條件,走到x米處要保證此時x米處所有香蕉數量不超過((50-x) + (50 - 2x) <= 50), 即(x >= 50 / 3)這樣才能進入第二階段,也就是帶着所有的不超過50根的香蕉一口氣走到橋尾。

2:第二階段是把在x米處的香蕉數量一口氣運送到橋尾,期間消耗香蕉數爲50-x個,到橋尾的時候剩餘數量可得爲(50-x) + (50 - 2x)  - (50 - x)個,即 50 - 2x個,要讓它最大,就得想最小,而x滿足 x>= 50 / 3,x取17,最終結果50 - 2 * 17 = 16個。

不過這樣有點無聊,像是純數學不等式問題,可以加點難度變爲編程問題,否則哪來的成就感,如果橋長爲s米,初始香蕉總量爲n根,猴子身上最多能放w根香蕉,每走1步就還是喫1根香蕉吧。

後續繼續分析以及補上代碼。

好幾個月過去了,終於有機會繼續分析這個問題,新問題同樣分2個階段:

1:相比原問題,第一階段階段進行分解,猴子每次走1米,每次都把剩餘所有香蕉向前搬動1米,假設到到其中一個點,猴子把香蕉向前再搬1米,需要消耗香蕉數量爲:2*(n / w)- 1,其中(n / w)代表需要搬的輪數,2輪要跑3次,3輪要跑5次....以此類推,有種情況是如果到倒數第二輪,如果後面還剩下1根香蕉,或者2根香蕉,則沒有必要回去再搬,所以消耗香蕉數量爲:2*(n % w < 2 ? n / w : n / w + 1)。這樣遞歸下去到了剩餘香蕉數量n'小於猴子負重能力w,則進行第二階段。

2:第二階段直接扛着剩餘所有香蕉一口氣走到頭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章