题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=2287
题解
设表示填满容量为的背包的方案数,类似背包处理,设为去掉一个容量为的物品时填满容量为的背包的方案数,那么。
代码
#include <cstdio>
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0')&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int maxn=2000;
const int mod=10;
int n,m,v[maxn+10],f[maxn+10],fk[maxn+10];
int main()
{
n=read();
m=read();
for(int i=1; i<=n; ++i)
{
v[i]=read();
}
f[0]=1;
for(int i=1; i<=n; ++i)
{
for(int j=m; j>=v[i]; --j)
{
f[j]+=f[j-v[i]];
if(f[j]>=mod)
{
f[j]-=mod;
}
}
}
for(int i=1; i<=n; ++i)
{
fk[0]=f[0];
for(int j=1; j<=m; ++j)
{
if(j<v[i])
{
putchar(f[j]+'0');
fk[j]=f[j];
}
else
{
int k=f[j]-fk[j-v[i]];
if(k<0)
{
k+=mod;
}
putchar(k+'0');
fk[j]=k;
}
}
putchar('\n');
}
return 0;
}