单调队列优化多重背包
我怎么这个都没学过。
以下内容参考 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\) 即可。

浙公网安备 33010602011771号