[动态规划] 背包扩展

[动态规划] 背包扩展

参考于 《背包九讲》中的一些问题和思路 。

背包九讲

混合背包的问题

\(01\) 背包和完全背包

按照枚举顺序的不同:

  1. 当前物品符合 \(01\) 背包性质,倒序循环。

  2. 符合完全背包性质,正序循环。

比较简单的思路。

三种背包

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\) 件物品。

实际上相当于每件物品多了一种“件数”的费用。

值得一提的是,二维费用背包问题也可以用 复数 来理解。

posted @ 2021-08-12 17:39  ¶凉笙  阅读(50)  评论(0编辑  收藏  举报