把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。
以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
思路:分两种情况
1.苹果少于盘子。留空盘子没用,不然就重复了,没有意义,所以遇到苹果比盘子少的,把多余的盘子去掉,再排列;
2.苹果多余盘子。苹果多,那就每个盘子先放一个苹果。一直这样递归,苹果多就每个盘子放苹果,苹果少就去掉盘子。
到最后,苹果剩余0个或盘子剩余一个就是最终情况。然后往上递归。。(怎么感觉思路好乱)
include<string.h>
include <stdio.h>
include
using namespace std;
int n,m;
int L(int m,int n)
{
if (m0||n1)//苹果为0或只有一个盘子,返回仅有的一种情况
return 1;
if (m<n)//苹果少盘子多,
return L(m,m);
return L(m-n,n)+L(m,n-1);
//1.每个盘子至少一个苹果,还剩m-n个,盘子有n个;
// 2. 至少有一个盘子空着,递归。这时苹果数量m先不变,盘子n-1
}
/*
1.至少一个盘子空着的情况。那么n-1个盘子,m个水果;(之所以n-1是因为可以一直递归,
实现((((n-1)-1)-1)-1)..... 盘子可以一个一个少。 )
2.每个盘子都满着的情况。 那就每个盘子都先放一个,然后再每个盘子放一个...,总有苹果不够的情况,
那不就是至少有盘子空的情况么,转到情况1,完成)
*/
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&m,&n);
printf("%d
",L(m,n));
}
return 0;
}