北京大学---放苹果(递归)

题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入描述:
每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出描述:
对输入的每组数据M和N,用一行输出相应的K。
示例1
输入
7 3
复制
8

/*
 * 递归
 * 设f(m,n)为分法结果,m为苹果数,n为盘子数
 * 对n进行讨论
 * .当m<n时,则必定有n-m个盘子永远空着,去掉它们对结果无影响
 * 即if(n>m) f(m,n)=f(m,m)
 * .当m>n时,分两类,含有0的方案数,不含0的方案数
 * 1.含有0的方案数,即有至少一个盘子空着,即相当于f(m,n)=f(m,n-1)
 * 2.不含0的方案数,即所有的盘子都有苹果,相当于可以从每个盘子中
 * 拿出一个苹果,不影响分法,即f(m,n)=f(m-n,n)
 * 而总的放法等于二者之和,即
 * f(m,n)=f(m,n-1)+f(m-n,n)
 *
 *
 * 递归出口条件:
 *      .当n=1时,所有苹果都i必须放在同一个盘子里,返回1
 *      .当m=0时,即没有苹果,返回1
 */

#include <stdio.h>
int fun(int m,int n){
    if(m==0||n==1){
        return 1;
    }
    else if(m<n){
        return fun(m,m);
    }
    else{
        return fun(m,n-1)+fun(m-n,n);
    }
}
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        printf("%d\n",fun(m,n));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/rytyy/article/details/80536443