单调队列优化多重背包
朴素的多重背包算法为
\[f[i][j]=\max(f[i-1][j-kv_i]+kw_i)(kv_i\le j,k\le lim[i])
\]
时间复杂度为\(O(V\sum lim[])\)。
先枚举i。设\(d=\lfloor\frac{j}{lim[i]}\rfloor\),\(r=j-lim[i]\cdot d\)。则上述转移可改写为
\[f[i][j]=\max(f[i-1][r+kv_i]+(d-k)w_i)
\]
将\(d\)移到\(\max()\)外面,得
\[f[i][j]=\max(f[i-1][r+kv_i]-kw_i)+dw_i
\]
此时\(\max()\)中的项只与\(k\)有关了,可以用单调队列优化。复杂度为\(O(nV)\)。

浙公网安备 33010602011771号