-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
- 把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
样例输出
-
8
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <utility>
void getOneRecord(int &m, int &n)
{
std::cin >> m >> n;
}
/*
* 这里m表示苹果数量, n表示盘子数量;主要分为3种情况:
* 1) m = n, f(m, n) = 1+f(m, n-1)
* 注: 当苹果和盘子数量相等时,就两种情况:1.每个盘子里均放一个 2.空出来一个盘子
* 2) m < n, f(m, n) = f(m, m)
* 注: 当苹果数量少于盘子时,此种情况等价于苹果和盘子数量相等时
* 3) m > n, f(m, n) = f(m-n, n)+f(m, n-1)
* 注:当苹果数量多于盘子时,分为两种情况:1.每个盘子里先放一个 2.空出来一个盘子
* 4) m=1 or n=1, f(m, n) = 1
* 注: 递归终止条件
*/
int compute(int m, int n, int dyBuffer[][10])
{
if (1 == m || 1 == n)
{
return 1;
}
else if (m == n)
{
return 1+compute(m, m-1, dyBuffer);
}
else if (m > n)
{
return compute(m-n, n, dyBuffer)+compute(m, n-1, dyBuffer);
}
else
{
return compute(m, m, dyBuffer);
}
}
int main(void)
{
int dyBuffer[10][10];
int count, m, n, ret;
std::cin >> count;
while (0 < count)
{
getOneRecord(m, n);
ret = compute(m, n, dyBuffer);
std::cout << ret << '\n';
--count;
}
return 0;
}