网上一般都是用递推做的,然后我很久以前用DP过了,最近看了下,居然做不出来了,再看回自己代码,还是不懂,然后拿自己代码请教别人···才记回来,真神奇。
DP[ i ][ j ][ k ]代表用i个盘子装k个苹果,k个盘子中苹果数最大为j个,复杂度O(n^4),虽然可以再优化,不过不想搞了,关键是这种状态我当时怎么推出来的,现在都想不出来的。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
int dp[11][11][11];
int main()
{
int i,j,k,l,sum;
int m,n,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
{
dp[1][i][i]=1;
}
for(i=2;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(k=j+1;k<=m;k++)
{
for(l=1;l<=j;l++)
{
dp[i][j][k]+=dp[i-1][l][k-j];
}
}
}
}
for(i=1,sum=0;i<=n;i++)
{
for(j=1;j<=m;j++)
{
sum+=dp[i][j][m];
}
}
cout<<sum<<endl;
}
return 0;
}