题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=2287
题解
设 f [ i ] f[i] f[i]表示填满容量为 i i i的背包的方案数,类似 0 / 1 0/1 0/1背包处理,设 g [ i ] g[i] g[i]为去掉一个容量为 v v v的物品时填满容量为 i i i的背包的方案数,那么 g [ i ] = f [ i ] − g [ i − v ] g[i]=f[i]-g[i-v] g[i]=f[i]−g[i−v]。
代码
#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;
}