传送门
题目背景
(poj1664)
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法)
输入输出格式
输入格式:第一行是测试数据的数目t(0 <= t <= 20),以下每行均包括二个整数M和N,以空格分开。1<=M,N<=10
输出格式:对输入的每组数据M和N,用一行输出相应的K。
输入输出样例
输入样例#1:
1 7 3
输出样例#1:
8
输入样例#2:
3 3 2 4 3 2 7
输出样例#2:
2 4 2
当没有苹果时为一种情况,当只有一个盘子时也有一种情况。(全放与不放)
1.若a<b,则必定有b-a个盘子空着 f[a][b]=f[a][a]
若a>b分两种情况。1.若 a个苹果放入b-1个盘子里,有一个为空。f[a][b]=f[a][b-1];
2.若没有空盘子,则从每个盘子中拿出一个苹果对方案无影响。f[a][b]=f[a-b][b] ;
方案数等于两者之和 (不断向外拿,定会有空盘子出现,然后转移至情况1)。
递推法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
//XHLRC
using namespace std;
int f[11][11]={0},n,m;
void XHN()
{
memset(f,0,sizeof("f"));
for(int i=0;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(j==1||i==0)f[i][j]=1;
else if(i<j)f[i][j]=f[i][i];
else f[i][j]=f[i-j][j]+f[i][j-1];
}
cout<<f[n][m]<<endl;
}
int main(){
int num;
scanf("%d",&num);
while(num--)
{
scanf("%d%d",&n,&m);
XHN();
}
}