题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2287

题解

f[i]f[i]表示填满容量为ii的背包的方案数,类似0/10/1背包处理,设g[i]g[i]为去掉一个容量为vv的物品时填满容量为ii的背包的方案数,那么g[i]=f[i]g[iv]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;
}