单调队列优化多重背包

本文最后更新于 2024年8月25日 上午

0 前置芝士

  • 背包DP

  • 多重背包

  • 单调队列

1 多重背包问题

多重背包问题说的是:假设现在有 nn 件物品和一个容量大小为 mm 的背包,第 ii 件物品的体积为 viv_i ,价值为 wiw_i,并且第 ii 件物品只有 sis_i 件,现在要选择这些物品中的一些装进背包,请最大化背包里的物品价值总和.

一般的,如果不加任何的优化,那么我们可以令 fif_i 表示当背包容量为 ii 时,所能获得的最大价值.状态转移方程为:

fj=max{fj,fik×vi+k×wi}f_j=max\{f_j,f_{i-k\times v_i}+k\times w_i\}

此时,若 i,j,ki,j,k 同阶,那么总时间复杂度为 O(n3)O(n^3).

这种做法但凡数据稍微大一点就会T掉,因此我们考虑进行优化.

主要的优化方式有两种,第一种是二进制分组,第二种就是单调队列优化.这里我们主要介绍一下单调队列优化.

2 单调队列

单调队列是一种数据结构,主要用于处理滑动窗口问题,可以在 O(n)O(n) 的时间内处理出每个窗口的最值等信息.

我们可以考虑对状态转移方程进行变形,然后套用单调队列进行优化.

3 优化

首先,优化的第一步,我们要先将状态分组.

具体来讲,就是把状态按照对 viv_i 进行取模的余数进行分组.也就是吧状态分成


单调队列优化多重背包
http://ljhljh1102,github.io/2024/07/14/单调队列优化多重背包/
作者
1102
发布于
2024年7月14日
许可协议