0-1ナップサック問題の分枝限定法による解法
(dp/branch-and-bound.hpp)
0-1ナップサック問題の、分枝限定法による解法
概要
0-1ナップサック問題
品物が$N$個(品物$0$から品物$N-1$)あり、品物$i$は価値$v_i$重さ$w_i$である。重さの総和が$W$以下となるようにいくつかの品物を選んだとき、選んだ品物の価値の総和の最大値$V_{\max}$を求めよ。
いくつかの品物について選択が決まったとき、残りの品物で有理ナップサック問題を解いて最適解の上界とする。再帰関数で探索するが、現在のノードでの最適解の上界が既知の解以下になった場合は、その先の探索を行わない(分枝限定法)。
使い方
-
BranchAndBound<V,W>(v,w)
: コンストラクタ。数列$v={v_i}$,$w={w_i}$を与える。計算量$\mathrm{O}(N\log N)$
-
run(w)
: w
で値$W$を与える。0-1ナップサック問題の解$V_{\max}$を返す。計算量$\mathrm{O}(2^N)$
注意点
- このライブラリは、弱いテストケースを狙う嘘解法での利用を想定したものである。
Verified with
Code
Back to top page