[动态规划] 背包扩展
[动态规划] 背包扩展
参考于 《背包九讲》中的一些问题和思路 。
混合背包的问题
\(01\) 背包和完全背包
按照枚举顺序的不同:
-
当前物品符合 \(01\) 背包性质,倒序循环。
-
符合完全背包性质,正序循环。
比较简单的思路。
三种背包
for i 1 to N
if 第 i 件物品属于 01 背包
ZeroOnePack(F,Ci,Wi)
else if 第 i 件物品属于完全背包
CompletePack(F,Ci,Wi)
else if 第 i 件物品属于多重背包
MultiplePack(F,Ci,Wi,Ni)
可以用二进制优化多重背包,复杂度 \(\text O(nV\ logM_i)\)。
至于单调队列优化怎么处理,目前还没发现,但二进制拆分已经很优秀了。
二维费用
解法
只需要在之前的转移方程中加一维,即(以 \(01\) 背包举例):
\(F[i,u,v]=max\{F[i-1][u-C_i][v-D_i]+W_i ,F[i-1][u][v] \}\)
物品总个数限制
有时二维费用会这么提问:最多只能取 \(U\) 件物品。
实际上相当于每件物品多了一种“件数”的费用。
值得一提的是,二维费用背包问题也可以用 复数 来理解。