多重背包求方案数如何用二进制拆分优化
  • 板块学术版
  • 楼主__newbie__
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/10/25 16:24
  • 上次更新2023/10/27 05:57:49
查看原帖
多重背包求方案数如何用二进制拆分优化
614884
__newbie__楼主2022/10/25 16:24

RT,众所周知多重背包二进制拆分的模板如下:

  for (int i = 1; i <= n; i++) {
    t += w[i] * m[i];
    for (int j = 1, num = m[i]; num; num -= j, j = min(j * 2, num)) {
      for (int k = t; k >= w[i] * j; k--) {
        dp[k] = max(dp[k], dp[k - w[i] * j] + v[i] * j);
      }
    }
  }

然而今天在做一道计算方案数的 dpdp 题目时,如下代码却产生了错误结果。

	dp[0] = 1;
	for (int i = 1; i <= c; i++) {
		sum += w[i] * p[i];
		for (int j = 1, num = p[i]; num; num -= j, j = min(j * 2, num)) {
			for (int k = sum; k >= w[i] * j; k--) {
				dp[k] += dp[k - w[i] * j];
			}
		}
	}

lz作为小萌新,属实想不通错在哪里。。。有没有有经验的巨佬来解答一下???

2022/10/25 16:24
加载中...