lougu4141
ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” — 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。
正难则反,我们先背包一下,算出没有约束条件的值,在减去不可发的情况,\(C(i,j),j>=a[i]\),我们直接背包计算了使用i的情况,他应该减去,在没有i的情况下其他物品装满\(j-a[i]\)的方案
code:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXX = 2020;
int f[MAXX], c[MAXX][MAXX], a[MAXX];
int n, m;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
f[0] = 1;
for (int i = 1; i <= n; ++i)
for(int j = m; j >= 0; --j)
if(j - a[i] >= 0)f[j] += f[j - a[i]] % 10;
for (int i = 1; i <= n; ++i) {
c[i][0] = 1;
for (int j = 1; j <= m; ++j) {
if(j >= a[i])c[i][j] = (f[j] - c[i][j-a[i]] + 10) % 10;
else c[i][j] = f[j] % 10;
printf("%d",c[i][j]);
}
printf("\n");
}
return 0;
}