LGP4141
LGP4141
我们首先可以看出这题与背包有关
我们先想一个暴力的解法
做n次背包,每次得到一个不选 一个物品 W[i] 的方案
这样做肯定会T,所以我们想想如何更好的得到答案
我们可以先跑一次背包,就得到了 f[i] 表示容量为 i 下的方案数
我们需要减去包含 W[i] 的方案数
所以用 g[i],表示容量为i 下不选W[i] 的方案数
/***********************************************************
> File Name: LGP4141.cpp
> Author: lan_m
> QQ: 2867930696
> Created Time: 2021/9/9 21:42:59
> Modified Time:2021/9/9 21:42:59
> fighting for night
*******************************************************/
#include <bits/stdc++.h>
using namespace std;
int n,m;
int f[2010],g[2010];
int w[2010];
int main () {
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i ++) {
scanf("%d",&w[i]);
}
f[0] = 1;
for (int i = 1;i <= n;i ++) {
for (int j = m;j >= w[i];j --) {
f[j] += f[j-w[i]];f[j]%=10;
}
}
for (int i = 1;i <= n;i ++) {
g[0] = 1;
for (int j = 1;j <= m;j ++) {
if( j >= w[i] ) g[j] = (f[j] - g[j-w[i]] + 10) % 10;
else g[j] = f[j];
cout << g[j];
}
cout << endl;
}
return 0;
}