放苹果 POJ - 1664
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
/*
设置状态量:设 m 个苹果放在 n 个盘子里放法总数是 f(m,n),
则:
m < n 时, f(m,n) = f(m,m)
m >= n 时,总放法 = 有盘子为空的放法+没盘子为空的放法
f(m,n) = f(m,n-1) + f(m-n,n)
*/
#include <iostream>
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 << f(m,n) << endl;
}
return 0;
}