题目:https://www.luogu.org/problemnew/show/P4141
竟然是容斥:不选 i 物品只需减去选了 i 物品的方案;
范围原来是2*10^3而不是2*103啊...
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,f[2100],g[2100],v[2100],w[2100]; int main() { scanf("%d%d",&n,&m); f[0]=1; for(int i=1;i<=n;i++) { scanf("%d",&w[i]); for(int j=m;j>=w[i];j--)(f[j]+=f[j-w[i]])%=10; } for(int i=1;i<=n;i++) { memcpy(g,f,sizeof f); for(int j=w[i];j<=m;j++) g[j]=(f[j]-g[j-w[i]]+10)%10;//g令i物品不会被选2次 for(int j=1;j<=m;j++)printf("%d",g[j]); printf(" "); } return 0; }