单调队列优化多重背包

我怎么这个都没学过。

以下内容参考 OI-wiki。

考虑一般的多重背包式子,记 \(f_{i, j}\) 为前 \(i\) 个物品装入大小为 \(j\) 背包的最大价值:

\[f_{i,j} = \max_{k = 1}^{k_i}{(f_{i - 1, j - k \times v_i} + w_i * k)} \]

接下来,记 \(g_{i, j} = f_{i, x \times v_i + y}\)\(g'_{i, j} = f_{i - 1, x \times v_i + y}\)

将转移方程表示为:

\[g_{x, y} = \max_{k = 0}^{k_i}{g'_{x - k, y} + w_i \times k} \]

\(G_{x, y} = g'_{x, y} - w_i \times x\),原方程可写为:

\[g_{x, y} = \max_{k = 0}^{k_i}{(G_{x - k, y}) + w_i \times x} \]

容易发现下面是一个单调队列的式子,直接维护 \(\max\) 即可。

posted @ 2026-02-09 20:34  FailureG_QwQ  阅读(16)  评论(0)    收藏  举报