题目:BZOJ2287
解析:
背包DP。
算是背包问题中的一个经典问题吧。参见「BZOJ2287」消失之物
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=2005;
int n,m;
int f[Max],ans[Max][Max],w[Max];
inline int get_int()
{
int x=0;char c;
for(c=getchar();!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
return x;
}
inline void print(int x)
{
if(x>9) print(x/10);
putchar('0'+x%10);
}
inline int add(int a,int b){return a+b>=10?(a+b)%10:a+b;}
int main()
{
n=get_int(),m=get_int();
f[0]=1;
for(int i=1;i<=n;i++)
{
w[i]=get_int();
for(int j=m;j>=w[i];j--) f[j]=add(f[j],f[j-w[i]]);
}
for(int i=1;i<=n;i++)
{
ans[i][0]=1;
for(int j=1;j<=m;j++)
{
if(j<w[i]) ans[i][j]=f[j];
else ans[i][j]=(f[j]-ans[i][j-w[i]]+10)%10;
print(ans[i][j]);
}
putchar('\n');
}
return 0;
}