题目传送门
如果是普通多重背包的话时间复杂度是
O
(
V
∑
m
)
O(V\sum m)
O(V∑m)的,过不去……
于是考虑二进制分组,即将
m
i
m_i
mi写成
∑
2
i
+
k
\sum 2^i+k
∑2i+k的形式,这样由于任意正整数可以写成一系列二进制的和,所以正确性可以保证。
这样,每一组的物品数由
m
i
m_i
mi降至了
log
2
m
i
\log_2 m_i
log2mi,这样再做01背包,复杂度是
O
(
V
∑
log
2
m
i
)
O(V\sum \log_2m_i)
O(V∑log2mi),这样就很滋磁了!
当然还有单调队列优化多重背包至
O
(
V
n
)
O(Vn)
O(Vn)的,只要题目不卡二进制优化这个单调队列优化也没什么用途……(不过真有卡的题……)
Code