放苹果(盘子相同)
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
苹果个数m 和盘子个数n(0<=M,1<=N<=10)
输出
不同的放法数目
借鉴的思路,分两种可能:一种是苹果数大于等于盘子数,第二种是苹果数小于盘子数。f(m,n)是求方法数的函数。
当m < n时,一定会有(n-m)个盘子空着,或者说至少会有(n-m)个盘子空着,这几个盘子对于接下来的苹果摆放一点影响都没有,直接去掉他们。所以有了 return f(m, m); 剩下的盘子数等于苹果数等于m.
当m >= n时,又可以分为两类:一类时有盘子为空(也就是包含0),第二类时盘子都不为空(不包含0)。
第一类(含0):肯定至少有一个盘子是空着的,所以就是 f(m, n-1)
第二类(不含0):先把每个盘子都放一个苹果,这放上去的n个苹果对剩下的苹果摆放没有影响,直接去掉即可,所以有f(m-n, n);
递归出口:
n == 1 所有苹果都放到一个盘子里 (这里f(m,n)可以看作是把m个苹果放到n个盘子上)
m == 0 没有苹果的时候
代码: */
#include<iostream>
using namespace std;
int f(int m, int n)
{
if (m == 0 || n == 1)
{
return 1;
}
else if (m < n)
{
return f(m, m);
}
else if (m >= n)
{
return f(m, n-1)+f(m-n, n);
}
}
int main(){
int m,n;
cin>>m>>n;
cout<<f(m,n);
return 0;
}