@@ -82,15 +82,13 @@ for (int i = 1; i <= n; i++)
82
82
83
83
可以考虑一个朴素的做法:对于第 $i$ 件物品,枚举其选了多少个来转移。这样做的时间复杂度是 $O(n^3)$ 的。
84
84
85
- 尽管这样看起来很蠢,我们还是写一下 dp 方程 :
85
+ 状态转移方程如下 :
86
86
87
87
$$
88
88
f_{i,j}=\max_{k=0}^{+\infty}(f_{i-1,j-k\times w_i}+v_i\times k)
89
89
$$
90
90
91
- 然而这样显然不够优秀,我们要对它进行优化。
92
-
93
- 可以发现,对于 $f_ {i,j}$ ,只要通过 $f_ {i,j-w_i}$ 转移就可以了。dp 方程为:
91
+ 考虑做一个简单的优化。可以发现,对于 $f_ {i,j}$ ,只要通过 $f_ {i,j-w_i}$ 转移就可以了。因此状态转移方程为:
94
92
95
93
$$
96
94
f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i)
121
119
122
120
## 多重背包
123
121
124
- 多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品可以选 $k_i$ 次,而非 $1$ 次。
122
+ 多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品 y 有 $k_i$ 个,而非 $1$ 个。
123
+
124
+ 一个很朴素的想法就是:把“每种物品选 $k_i$ 次”等价转换为“有 $k_i$ 个相同的物品,每个物品选一次”。这样就转换成了一个 0-1 背包模型,套用上文所述的方法就可已解决。状态转移方程如下:
125
125
126
- 一个很朴素的想法就是:把“每种物品选 $k_i$ 次”等价转换为“有 $k_i$ 个相同的物品,每个物品选一次”。这样就转换成了一个 0-1 背包模型,套用上文所述的方法就可已解决。时间复杂度: $O(nW\sum k_i)$ ,可以轻松 TLE。
126
+ $$
127
+ f_{i,j}=\max_{k=0}^{k_i}(f_{i-1,j-k\times w_i}+v_i\times k)
128
+ $$
127
129
128
- 虽然我们失败了,但是这个朴素的想法可以给我们的思路提供一些借鉴——我们可以把多重背包转化成 0-1 背包模型来求解 。
130
+ 时间复杂度 $O(nW\sum k_i)$ 。
129
131
130
- 显然,复杂度中的 $O(nW)$ 部分无法再优化了,我们只能从 $O(\sum k_i)$ 处入手。
132
+ ### 二进制分组优化
131
133
132
- 为了表述方便,我们用 $A_ {i,j}$ 代表第 $i$ 种物品拆分出的第 $j$ 个物品。
134
+ 考虑优化。我们仍考虑把多重背包转化成 0-1 背包模型来求解。
135
+
136
+ 显然,复杂度中的 $O(nW)$ 部分无法再优化了,我们只能从 $O(\sum k_i)$ 处入手。为了表述方便,我们用 $A_ {i,j}$ 代表第 $i$ 种物品拆分出的第 $j$ 个物品。
133
137
134
138
在朴素的做法中, $\forall j\le k_i$ , $A_ {i,j}$ 均表示相同物品。那么我们效率低的原因主要在于我们进行了大量重复性的工作。举例来说,我们考虑了“同时选 $A_ {i,1},A_ {i,2}$ ”与“同时选 $A_ {i,2},A_ {i,3}$ ”这两个完全等效的情况。这样的重复性工作我们进行了许多次。那么优化拆分方式就成为了解决问题的突破口。
135
139
146
150
147
151
显然,通过上述拆分方式,可以表示任意 $\le k_i$ 个物品的等效选择方式。将每种物品按照上述方式拆分后,使用 0-1 背包的方法解决即可。
148
152
149
- 时间复杂度 $O(nW\sum\log k_i )$
153
+ 时间复杂度 $O(W\sum _ {i=1}^n\log_2k_i )$
150
154
151
155
??? 二进制分组代码
152
156
```cpp
165
169
}
166
170
```
167
171
168
- ??? note "[ 「Luogu P1776」宝物筛选\_ NOI 导刊 2010 提高(02)] ( https://www.luogu.org/problemnew/show/P1776 ) "
169
- 题意概要:有 $n$ 种物品和一个容量为 $W$ 的背包,每种物品有 $m_v{i}$ 个,同时每个物品有两种属性:重量 $w_ {i}$ 和价值 $v_ {i}$ 。要求选若干个物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。有一点需要注意的是本题数据范围较大,情况较多。
172
+ ### 单调队列优化
173
+
174
+ 见 [ 单调队列/单调栈优化] ( opt/monotonous-queue-stack.md ) 。
175
+
176
+ 习题: [ 「Luogu P1776」宝物筛选\_ NOI 导刊 2010 提高(02)] ( https://www.luogu.org/problemnew/show/P1776 )
170
177
171
178
## 混合背包
172
179
0 commit comments