递归例题:放苹果

2017-11-02  本文已影响0人  见习炼丹师
#include <iostream>

using namespace std;

int setapple(int m,int n){//m个苹果,n个盘子
    if(n==0){
        return 0;
    }
    if(m==0){
        return 1;
    }
    //必然会空的盘子就可以去掉
    if(n>m){
        return setapple(m,m);
    }
    else{
        //分为两种情况,一种是有盘子为空的放法,即第二个表达式,先空出一个盘子,把问题简单化
        //一种是没有盘子为空的放法,即第一个表达式,先把每个盘子先放一个再说
        return setapple(m-n,n)+setapple(m,n-1);
    }
}

int main()
{
    int t,m,n;
    cin>>t;
    while(t--){
        cin>>m>>n;
        cout<<setapple(m,n)<<endl;
    }
    return 0;
}

这里利用分类分别递归的思想,通过分析题目可知,不能通过先走一步,减少问题规模,而是直接分成几个大类,同时,注意规划好边界条件来终止递归。

上一篇 下一篇

猜你喜欢

热点阅读