描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
7 3
样例输出
8
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include<cstdlib>
#define DISK_MAX_NUMBER 10
unsigned int disk[DISK_MAX_NUMBER];
size_t diskTotalNumber;
unsigned int appleTotalNumber;
unsigned int methodTotalNumber;
void dfs(const size_t diskCode, const unsigned int remainder){
if (diskCode == diskTotalNumber){
if (remainder == 0){
++methodTotalNumber;
}
}
else{
for (unsigned int i = diskCode == 0 ? 0 : disk[diskCode - 1]; i <= remainder; ++i){
disk[diskCode] = i;
dfs(diskCode + 1, remainder - i);
}
}
}
int main(void){
unsigned int testTimes;
cin >> testTimes;
while (testTimes--){
cin >> appleTotalNumber >> diskTotalNumber;
methodTotalNumber = 0;
dfs(0, appleTotalNumber);
cout << methodTotalNumber << endl;
}
return EXIT_SUCCESS;
}