多重背包
有 (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)) 的复杂度实现