背包九讲

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]] 的影响消失了。

3. 有依赖的背包问题

posted @ 2024-11-05 21:36  Razer_Sun  阅读(31)  评论(0)    收藏  举报