转载请写明出处:http://blog.csdn.net/big_heart_c
题目:
把N个同样的苹果放在M个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据N和M,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
思路:
n个苹果放在m个盘子里,记为C(n,m),可递归为C(n,m-1)+C(n-m,m)。C(n,m-1)表示n个苹果放入m-1个盘子的情况;而C(n-m,m)则表示n个苹果放满m个盘子,之所以为“n-m”,是因为先把n个苹果每个盘子都放一个,所以就剩下n-m个苹果。
但是,当“m>n”时,n个苹果无法放满m个盘子,所以此时只需“return c(n,n-1)”。
接下来在考虑分解条件,当“n<=1||m<=1”时,只有一种情况,故 return 1;
综上所述,可得以下表达式:
n<=1或m<=1 return 1;
m>n return c(n,n-1);
m<=n return c(n,m-1)+c(n-m,m);
接下来就是代码:
- //From Big_Heart
- #include <iostream>
- using namespace std;
- int c(int ,int );
- int i=0;
- void main(){
- int n,m,count=0;
- cin>>count;
- while(count--){
- cin>>n>>m;
- cout<<c(n,m)<<endl;
- }
- }
- int c(int n,int m){
- if(n<=1||m<=1)
- return 1;
- if(m>n)
- return c(n,n-1);
- else
- return c(n,m-1)+c(n-m,m);
- }