多重背包

多重背包

参考博客 https://www.cnblogs.com/JoeFan/p/4165956.html

\(n\) 个物品,每个物品的体积为 \(v_i\) ,价值为 \(w_i\) ,数量为 \(a_i\) ,问体积不超过 \(m\) 的背包的最大价值

可以利用单调队列优化,在 \(O(nm)\) 的复杂度实现

Solution

首先,考虑朴素的做法为,设 \(dp(i,j)\) 表示处理了 \([1,i]\) 的物品,现在背包中物品的体积和为 \(j\) 的最大价值.有

\[dp(i,j) = \min\{ dp(i-1,j-kv_i)+kw_i \}, 0 \le k \le a_i \]

\(j = x \cdot v_i+y\) .则有

\[dp(i,j) = \min\{ dp(i-1,y+k'v_i) + (x-k')w_i\} , x-a_i \le k' \le x \]

对于 \(y\) 相同的 \(j\) 一起考虑,发现这就是一个滑动窗口问题.

所以用单调队列在 \(O(nm)\) 的复杂度实现

posted @ 2020-05-23 09:33  LJZ_C  阅读(116)  评论(0编辑  收藏  举报