(非求调,悬关)关于多重背包二进制优化的一个问题
  • 板块学术版
  • 楼主残阳如血
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/1/30 19:06
  • 上次更新2025/1/31 11:30:37
查看原帖
(非求调,悬关)关于多重背包二进制优化的一个问题
726139
残阳如血楼主2025/1/30 19:06

NN 物品数量,VV 背包体积,vv 体积,ww 价值,ss 数量

#include <iostream>
const int MAX = 2e3 + 10;

int N, V, f[MAX];

int main() {
  std::cin >> N >> V;
  for (int i = 1, v, w, s; i <= N; ++i) {
    std::cin >> v >> w >> s;
    for (int k = 1; k <= s; k <<= 1) {
      for (int j = V; j >= k * v; --j)
        f[j] = std::max(f[j], f[j - k * v] + k * w);
      s -= k;
    }
    if (s) {
      for (int j = V; j >= s * v; --j)
        f[j] = std::max(f[j], f[j - s * v] + s * w);
    }
  }
  std::cout << f[V] << std::endl;
  return 0;
}

请问

if (s) {
  for (int j = V; j >= s * v; --j)
    f[j] = std::max(f[j], f[j - s * v] + s * w);
}

这里的作用是什么?

上面对于 kk 的循环不应该遍历到 1s1\sim s 的全部数量了吗?

小号给关。

2025/1/30 19:06
加载中...