放苹果——递归


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

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

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

#include 
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<endl;
        
    }
    return 0;
}

相关