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;
}
posted @ 2018-10-18 21:46  ART_coder  阅读(75)  评论(0编辑  收藏  举报