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);
}
}
}
然而今天在做一道计算方案数的 dp 题目时,如下代码却产生了错误结果。
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作为小萌新,属实想不通错在哪里。。。有没有有经验的巨佬来解答一下???