汽水瓶

题目

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是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;
}
posted @ 2019-09-01 20:38  煊奕  阅读(226)  评论(0编辑  收藏  举报