2016 USP Try-outs The Knapsack problem

题意

完全背包,查询容量为\(W\)的最大价值。
\(n\)个物品,容量\(w_i\),价值\(v_i\)
\(n\le 10^3,w_i\le 10^3,v_i\le 10^9.W\le 10^9\)

做法

令\(f(S)\)表示容量不超过\(S\)的最大价值
显然有\(f(S)=max\{f(X)+f(S-X)\}\)
我们让\(X,S-X\)尽量接近,显然有\(|X-(S-X)|\le 10^3\)

令\(T=10^3\)
\(|X-(S-X)|\le 10^3\Longrightarrow \frac{S}{2}-\frac{T}{2}\le X\le \frac{S}{2}+\frac{T}{2}\)

我们需要得到\([\frac{S}{2}-\frac{T}{2},\frac{S}{2}+\frac{T}{2}]\)范围内的dp值

再次分裂,\([\frac{S}{4}-\frac{3}{4}T,\frac{S}{4}+\frac{3}{4}T]\)

易得\(T\)前系数不会超过\(1\),故我们直接对每层实行\(2T\)范围的dp
总复杂度\(O(T^2logW)\)

上一篇:背包算法(Knapsack Algorithm)


下一篇:Visual Studio 2010(.NET 4.0)中使用SQLite.NET