递归例题:放苹果

#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;
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容