-
题目描述:
-
把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
坦率地讲,刚开始递归策略并没有想明白,借鉴了网上的资料http://www.cnblogs.com/jasonJie/p/5757936.html和http://blog.csdn.net/carvin_zh/article/details/46490511
最主要的思想就是分为两种情形:一种情形是有空盘,相当于f(m,n-1);
另一种情形是无空盘,相当于先将n个盘子中各放入一个水果,再对剩下的m-n个水果放到n歌盘中,即f(m-n,n)。
故所有的分法即为f(m,n-1)+f(m-n,n),这是一般公式。
#include<stdio.h>
int f(int m, int n) {
if (n == 1)
return 1;
else if (m == 0 || m == 1)
return 1;
else if (m < 0)
return 0;
else
return f(m, n - 1) + f(m - n, n);
}
int main() {
int m, n, k;
scanf("%d", &k);
while (k--) {
scanf("%d%d", &m, &n);
printf("%d\n", f(m, n));
}
return 0;
}
题目链接:
http://ac.jobdu.com/problem.php?pid=1160