单调队列优化多重背包

朴素的多重背包算法为

\[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)\)

posted @ 2018-10-08 22:26  Utoрia  阅读(138)  评论(0)    收藏  举报