Official
B - Binary Knapsack Editorial by admin
重みが \(2\) 冪で価値が \(0\) のダミーの品物が無限にあるとすると、ちょうど重みの和が \(W\) になるように選ぶことだけを考えれば良いです。
\(W\) が偶数の時、重み \(1\) の品物を選ぶ個数は偶数個である必要があります。また、その際価値の降順に選ぶのが明らかに最善です。つまり、重み \(1\) の品物を価値の降順に \(2\) つずつペアにして重み \(2\) の品物として扱っても良いです。そのような操作を行うことで現れる重みが全て偶数になるため、\(W\) および全ての品物の重みを \(2\) で割っても答えは変わりません。
\(W\) が奇数の時、重み \(1\) の品物を奇数個選ぶ必要があります。このとき、重み \(1\) の品物のうち価値が最大のものは必ず選ぶため、これを選び \(W\) が偶数の場合に帰着することが出来ます。
このような手順を高々 \(O(\log W)\) 回繰り返すことで \(W\) が \(0\) になり、その時に選んだ品物の価値の総和が答えとなります。 これを適切に実装すると、テストケースあたりの計算量は \(O(N \log N + \log W)\) となります。(コード)
posted:
last update: