总时间限制:
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<bits/stdc++.h>//Writed by Wangzhimin Date:2022.05.10
int apple[105][105];//存放苹果与盘子的数组
int tmp[105];//暂时存的每种放法
using namespace std;
int main()
{
int i,j,k,m,n;
scanf("%d",&k);//输入组数
for(int t=0;t<k;t++){//苹果与盘子数
scanf("%d%d",&m,&n);
memset(apple,0,sizeof(apple));
for(i=1;i<100;i++)//不一定是100,可是20就可
{
apple[i][1]=1;//一个苹果是一种放法
apple[1][i]=1;//一个盘子是一种放法
apple[0][i]=1;//没苹果是一种放法
}
for(i=2;i<=m;i++)//从2个苹果和2 个盘子 开始
for(j=2;j<=n;j++){
if(i<j)//如果苹果小于盘子,就是苹果数就行(因为有空盘子)
apple[i][j]=apple[i][i];
else//递推公式中的算法,用在递推中
apple[i][j]=apple[i][j-1]+apple[i-j][j];}//有盘子为空,和无盘子为空的放法的和
tmp[t]=apple[m][n];}//求出的值,放在 tmp中
for(i=0;i<k;i++)//输出
cout<<tmp[i]<<endl;
return 0;
}