放苹果-DP
小蒜想知道把 MM 个同样的苹果放在 NN 个同样的盘子里,允许有的盘子空着不放,共有多少种不同的分法?(用 KK 表示)55,11,11 和 11,55,11 是同一种分法。
输入格式
第一行是测试数据的数目 t(0 \le t \le 20)t(0≤t≤20)。
以下每行均包含两个整数 MM 和 NN,以空格分开。1 \le M, N \le 101≤M,N≤10。
输出格式
对输入的每组数据 MM 和 NN,用一行输出相应的 KK。
代码段
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<cstring>
#include<set>
#include<cmath>
typedef long long ll;
using namespace std;
ll meme[12][12];
int main()
{
for(int i=1;i<=10;i++)
meme[1][i]=1;
for(int i=1;i<=10;i++)
meme[i][1]=1;
for(int i=1;i<=10;i++)
meme[0][i]=1;
for(int i=1;i<=10;i++)
meme[i][0]=1;
meme[0][0]=1;
for(int i=2;i<=10;i++)
for(int j=2;j<=10;j++)
{
if(j>i)
meme[i][j]=meme[i][j-1];
else
meme[i][j]=meme[i-j][j]+meme[i][j-1];
}
int sum;cin>>sum;
while(sum--)
{
int x,y;
cin>>x>>y;
cout<<meme[x][y]<<endl;
}
return 0;
}
当盘子数量比苹果多的时候(i>j),meme[i][j]这个状态的值等于i这个果子数与盘子数数量相等时值
而当盘子数量小于苹果时,加上meme[i][j-1](有一个空盘子不选)于meme[i-j][j](多余的果子再j个盘子下的状态)