-
j的枚举顺序
1)当前状态是由上一个状态递推出来的话, 那么我们就需要倒叙枚举体积 -> 除优化状态转移方程的完全背包问题
2)当前状态由其本身递推出来的话我们就顺序枚举体积 -> 优化状态转移方程的完全背包问题
原因:
I. f[i - 1][j - v[i]]
倒序: 倒序的话j - v[i] < j也就是算j的时候j - v[i]还没有算过, 那么它一定就还是前一个f[i - 1][j - v[i]]的状态, 等价变形;
II. f[i][j - v[i]]
顺序: 在算j之前j - v[i]已经算过了, 也就是更新成了f[i][j - v[i]], 等价变形; -
降维优化对于时间复杂度没有改变, 只能优化空间复杂度
(f[m]表示的是体积小于等于m的value_max, f[n][m]表示的是前n件物品中选出体积不大于m的value_max) -
j >= v表示背包的体积够不够装第i个物品 <=> 放不放第i个物品(j至少要等于v不然根本没办法装其他的物品)
-
枚举放i的多少个的(完全, 多重) f[i][j] = max(f[i][j], …); 顺序枚举j
枚举第i个放或不放的(01, 分组) f[i][j] = max(f[i - 1][j], …); 倒序枚举j -
如果要, 求前i个物品体积正好等于j的value_max, 只需要在初始化f数组时将f[N][0] = 0; f[N][i] = -inf[1<=i<=v];
(这样操作的话, 其他状态(j < m)的最大值都是-inf, 转移到f[n][m]也会被pass掉, 从而使得最大值就是前i个物品体积正好等于j的value)
数字三角形
01背包
完全背包
朴素的多重背包
二进制优化的多重背包
分组背包
分组和01同类型
选或不选
多重背包和完全背包同类型
不选 ~ 选几个