转载出处:
http://blog.csdn.net/xiaofei_it/article/details/17042651
hdu 2082
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int dp1[55],dp2[55];
int v[30];
int num[30];
void solve()
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
dp1[0]=1;
for(int i=1;i<=26;i++)
{
for(int j=0;j<=num[i]&&j*v[i]<=50;j++)
{
for(int k=0;k+v[i]*j<=50;k++)
{
dp2[k+j*v[i]]+=dp1[k];
}
}
for(int j=0;j<=50;j++)
{
dp1[j]=dp2[j];
dp2[j]=0;
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(v,0,sizeof(v));
for(int i=1;i<=26;i++)
{
v[i]=i;
cin>>num[i];
}
solve();
int ans=0;
for(int i=1;i<=50;i++)
{
ans+=dp1[i];
}
cout << ans << endl;
}
}
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int dp1[55],dp2[55];
int v[30];
int num[30];
void solve()
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
dp1[0]=1;
for(int i=1;i<=26;i++)
{
for(int j=0;j<=50;j++)
{
for(int k=0;k<=num[i]&&k*v[i]+j<=50;k++)
{
dp2[j+k*v[i]]+=dp1[j];
}
}
for(int j=0;j<=50;j++)
{
dp1[j]=dp2[j];
dp2[j]=0;
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(v,0,sizeof(v));
for(int i=1;i<=26;i++)
{
v[i]=i;
cin>>num[i];
}
solve();
int ans=0;
for(int i=1;i<=50;i++)
{
ans+=dp1[i];
}
cout << ans << endl;
}
}
更多:http://www.cnblogs.com/lijunle/archive/2010/09/04/1817764.html