题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同
的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入描述:
每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出描述:
对输入的每组数据M和N,用一行输出相应的K。
分析:
输入为m个苹果,n个盘子。求fun(m, n)现在分情况讨论:
- 当 n < m 时, 这时候一定会空出m - n个盘子,也就是说fun(m, n) = fun(m, m)
- 当 n >=m 时,这时候放法又可以分为至少空一个盘子和一个盘子都不空两种情况
空一个盘子为fun(m, n - 1), 一个盘子都不空就相当于先每个盘子放一个苹果再把它们
拿掉,放法和用剩下的m - n个苹果放进n个盘子一样,此时为fun(m - n, n).而总的方法
为二者之和
3.递归退出条件:一是n逐渐减小,减到1,一个盘子便只有一种放法,二是m逐渐减小
减到0,也是一种放法。
#include <iostream>
using namespace std;
int fun(int m, int n){
if((m == 0) || (n == 1)) return 1;
if(m < n) return fun(m, m);
else return fun(m, n - 1) + fun(m - n, n);
}
int main(){
int m, n;
while(cin >> m >> n) {
cout << fun(m, n) << endl;
}
return 0;
}