题目
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
链接:https://www.nowcoder.com/questionTerminal/fe298c55694f4ed39e256170ff2c205f
来源:牛客网
正常思路,递归
/*
递归问题:最主要是先分析出其递归方程,此外,可以考虑是否可以使用迭代替换。
3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1 //4个瓶子,其中3个可以换1瓶水+1个空瓶,所以是f(2)+1
f(5) = f(3)+1 //3个瓶子换1瓶水+1个空瓶,所以是f(3)+1
...
f(n) = f(n-2)+1
*/
#include <iostream>
using namespace std;
int f(int n)
{
if(n==1) return 0;
if(n==2) return 1;
return f(n-2)+1;
}
int main()
{
int n;
while(cin >> n){
if(n==0)
break;
cout<<f(n)<<endl;
}
return 0;
}
巧解
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n == 0) break;
//每3瓶换一瓶,剩余一瓶
//实际上每两瓶就能换一瓶且没有剩余
//极限想法,尽可能地借即得最大量
//数学证明:
cout<<n/2<<endl;
}
return 0;
}