有一天,皮皮扬有钱了,就叫上了CC去吃一个榴芒,到了店里的时候,皮皮扬买了M个芒果班戟,她想把这些芒果班戟放在N个盘子里,允许盘子可以不放,不过皮皮扬的思维不好,不知道怎么放这些,现在就需要我们来帮皮皮扬算一下一共有多少种不同的分法?
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入 复制
1 7 3
样例输出 复制
8
提示
5,1,1和1,5,1 是同一种分法。
- 这个用排列组合不适合做出来,很麻烦。
- 分情况讨论,写下递归条件
- 如果没有芒果或者说只有1个盒子,这个时候情况是1
- 如果盒子大于芒果的数量,那么多出来的空盒子情况刚好是和m个芒果装m个盒子情况是一样的,因为空盒子再多,装出来,也是一种情况
- 其他的情况就是我们放m-n个芒果,多出来的另外分配(是在每一个放好的情况上放m-n个芒果),加上每减少一个盒子分配芒果的情况个数。
-
#include "stdio.h" long long slove(long long m,long long n) { if(m==0||n==1) return 1; //没有芒果和只有一个盒子都是1 if(n>m) return slove(m,m); //如果盒子大于芒果,多出来的空盒子情况和刚好m个芒果装m个盒子情况一样是一样的情况 return slove(m-n,n)+slove(m,n-1); //第一个递归如果m>n需要考虑在放好的情况下,多出来的个数, //第二个递归是每次减少一个盒子所能装下的次数 } int main() { long long m,n; int t,i; while(~scanf("%d",&t)) { for(i=0;i<t;i++) { scanf("%lld%lld",&m,&n); printf("%lld\n",slove(m,n)); } } return 0; }