放苹果
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 32121 Accepted: 20178
Description
把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
Source
lwx@POJ
算法思想
首先要从数学的角度认识,这个问题属于整数的划分问题,即将正整数表示成一系列正整数之和——正整数N的划分。
在正整数N的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n, m),可以建立如下递归关系。
(1)q(n, 1)=1, n>=1;
(2)q(n, m)= q(n, n), m>=n;
(3)q(n, n)= 1+q(n, n-1);
(4)q(n, m)= q(n, m-1)+q(n-m, m), n>m>1。
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int mathods(int m, int n);
int main(void)
{ int t, M, N;
cin>>t;
while (t--)
{
cin>>M>>N;
cout<< mathods(M, N);
cout<<endl;
}
return 0;
}
int mathods(int m, int n)
{
if((m<1)||(n<1))
return 0;
if((m==1)||(n==1))
return 1;
if(m<n)
return mathods(m, m);
if(n==m)
return mathods(m, n-1)+1;
return mathods(m, n - 1)+ mathods(m - n, n);
}