問題描述
無意間想起了這樣一個問題:
一塊錢可以買1瓶可樂,兩個瓶蓋子可以又可以換一瓶可樂,問,現在有十塊錢,最多可以喝多少瓶可樂?
背景
相信這個問題應該有不少人問過,而且,面試編程的時候居然也有人問這種問題。剛認真思考了一下,得出答案如下:
方法一
分析:
首先,10塊錢一次性可以買10瓶,單拿出一瓶,而從剩下的9瓶中,每次拿出一個瓶蓋和這個瓶蓋就可以再換一瓶可樂,並且得到一個瓶蓋,即,一共可以換得:
1+2*(10-1)=19(瓶)
如果是y元,那則一共可以換得:
1+2*(y-1)=2*y-1(瓶)
似乎,這樣就算做完了,那麼問題來了,如果現在是2塊錢一瓶呢?這個問題可以劃歸爲1塊錢一瓶,而一共有[y/2]
的問題,中括號是取整的意思。
那再進一步擴展,那如果是三個瓶蓋換一瓶可樂呢?咋一看問題似乎有點複雜,我第一時間的想法是:
直接按照正常人的思維,10塊錢可以買10瓶,然而得到的蓋子可以換3瓶可樂,並且剩餘一個蓋子,再把剩下的這個蓋子和新得到的3個蓋子換1瓶可樂,剩餘1+1=2個蓋子,如此往復,當剩餘的蓋子數目小於3時,程序終止。
如下過程:
10 % 3 = 3......1
(3+1) % 3 = 1......1
(1+1) <3, 程序終止。
//最後得到10+3+1個蓋子。
代碼我就不上了,很簡單,可以用遞歸或者循環解決。
但是再仔細一想,這個應該也可以求得其通項。
分析:
一次性可以買10瓶,先拿出1個蓋子,剩下得9=2*4+1個蓋子,每兩個蓋子和這個蓋子組合就可以換一瓶新的可樂,並且得到一個新蓋子,即一共還可以再換得4瓶,最後剩餘兩個蓋子,最後,一共可以換得:
10 + [(10-1)/2] = 14(瓶)
相應的,如果時k個蓋子可以換一瓶可樂,n元可以換得的瓶子數的通項就是:
n+[(n-1)/(k-1)] //中括號表示取整
再進一步擴展,如果除了蓋子,空的瓶子也能換可樂呢?比如 m個瓶子換一瓶可樂,那通項應該是:
n+[(n-1)/(k-1)] +[(n-1)/(m-1)]
當然還可以繼續擴展其他的問題。個人感覺只要靜心思考,應該都能想出來的。這裏就不再敘述了。
說點題外話,剛看完一部電影,《怦然心動》,很經典的電影了,很好看,不過跟之前想想的不同,大家想看的可以點擊這裏