放苹果——递归

这题和上一题一样都是将问题分解为若干个子问题,这题难度会大一点,递归关系自己想的话不是那么好想:

 

 

  这题和上一题一样,先找递推式,但是这题的递推式会稍微难一点,有两种情况,第一种情况是盘子的数量比苹果的数量多的情况,如果苹果少的话,就相当于最多只能i个盘子每个盘子放1个苹果,剩下的空盘子就不管了。第二种情况就是盘子少的话,如果有空盘子的话,就i至少会有一个空盘子把,所以就把盘子数减一继续递归,没有空盘子的方法至少每一个盘子里都有一个苹果把,先把苹果分完之后再继续这些不同的分法。

  这两题很明显就可以看出来递归的格式与思路了,最后最重要的就是边界条件的确定。边界无非就是盘数为0的话就只有1种分法,如果苹果数是0的话就只有0种分法。

复制代码
#include <iostream>
using namespace std;
int f(int m, int n){
    if(n>m){
        return f(m,m);
    }
    if(m == 0)
        return 1;
    if(n == 0)
        return 0;
    return f(m,n-1)+f(m-n,n);
}
int main(){
    int t,m,n;
    cin>>t;
    while(t--){
        cin>>m>>n;
        cout<<f(m,n)<<endl;
        
    }
    return 0;
}
复制代码

 

posted @   prize  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示