两个瓶盖换一瓶可乐问题

来源:互联网 发布:皮下脂肪怎么减 知乎 编辑:程序博客网 时间:2024/04/27 14:50

问题描述

无意间想起了这样一个问题:
一块钱可以买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)]  

当然还可以继续扩展其他的问题。个人感觉只要静心思考,应该都能想出来的。这里就不再叙述了。

说点题外话,刚看完一部电影,《怦然心动》,很经典的电影了,很好看,不过跟之前想想的不同,大家想看的可以点击这里

0 0
原创粉丝点击