1. 01 背包问题
一切的一切的基石!!!
// v: c[i] to V
f[i][v] = max(f[i - 1][v], v[i - 1][v - c[i]] + w[i]);
解释:
考虑第 \(i\) 位有选和不选两种选择,选了就减去 c[i],附有 w[i] 的影响。
优化:倒序可以省去第一维。
为什么写成这样?
很容易发现 f[i][j]
会被 f[i][j - w[i]]
所影响。
所以:从大到小枚举
- 如果要求把背包填满:\(f[1 \rightarrow v] = -inf\)!
解释:可以理解成 \(f[i]\) 赋值为 \(0\) 是前一种情况合法的初始操作,而不是后一种的合法操作!
2. 完全背包问题
倒序变成正序就可以了。
因为 f[i][j - w[i]]
的影响消失了。