题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
输入样例
3
3 2
4 3
2 7
输出样例
2
4
2
题目分析
该题用递归的方式进行分析,又因为题目要求“5,1,1和1,5,1 是同一种分法”所以可以将苹果从小到大进行分配,即让上一个盘子中分配到的苹果小于或等于此盘子中将要分得的苹果数量。
for(int i=I;i<=M;i++){ //让之后分的大于等于之前分的可以避免重复 注:i<=M!!!
Apple(M-i,N-1,i);
}
代码
#include<iostream>
using namespace std;
void Apple(int M,int N,int I);
int number=0;
int main(void){
int t;
cin>>t;
int apple[t][2];
//堆中定义二位数组
/*
int **apple=new int*[t];
for(int i=0;i<t;i++){
apple[i]=new int[2];
cin>>a[i][0]>>a[i][1];
}*/
for(int i=0;i<t;i++){
cin>>apple[i][0]>>apple[i][1];
}
for(int i=0;i<t;i++){
Apple(apple[i][0],apple[i][1],0); //允许空盘子让I从0开始
cout<<number<<endl;
number=0;
}
return 0;
}
void Apple(int M,int N,int I){
if(N==0&&M==0){
number++;
return;
}
else if(N<0||M<0){
return;
}
for(int i=I;i<=M;i++){ //让之后分的大于等于之前分的可以避免重复 注:i<=M!!!
Apple(M-i,N-1,i);
}
}