得られた経験値/使ったお金の最大値を二分探索で探す。
買うアイテムを表すベクトルをx∈{0,1}Mとする。λ>0が与えられたとき、得られた経験値/使ったお金がλ以上であることは
T1x(1)+...+TMx(M)S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)≥λ
と表され、これはx=0という条件下では
−λT1x(1)−...−λTMx(M)+S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)≥0
と同値である。したがって、大ざっぱに言えば、左辺が0以上になるような最大のλを二分探索で求めればよい。
(ただ、後者の不等式はx=0、つまりアイテムをひとつも買わないケースで常に成立してしまうため、これを除かなければならない。x=0 の場合に不等式が成り立たないようにするためには、double floatの計算誤差よりは大きいが問題の許容誤差よりは小さい数ϵ(たとえば10−7)を設定して
−λT1x(1)−...−λTMx(M)+S1x(A1,1)x(A1,2)...x(A1,k1)+...+SNx(AN,1)x(AN,2)...x(AN,kN)≥ϵ
とすればよい。)
さて、λを決めた時に左辺の最小値は最小カットで求まる。以下はyosupoさんのフレームワークにしたがって考える。
項−λTix(i)は次のように解釈する:
- 物αiを選ぶとλTi円の罰金がかかるが、物αiを選ばなければ罰金なしである。
また、項Sjx(Aj,1)x(Aj,2)...x(Aj,kj)は次のように解釈する:
- 無条件でSj円手に入る。
- 物βjを選ばなければSj円の罰金がかかる。
- 物βjを選んだのに品物αAj,1を選ばなかったら+∞円の罰金がかかる。物βjを選んだのに物αAj,2を選ばなかったら+∞円の罰金がかかる。……
これらの条件に対応したネットワークを作って最大流を求めると、最小カットの容量cも求まる。∑Sj−cが上の不等式の左辺の最小値である。
サンプル1を例にとってグラフを与える:
3 4
4 3 2
4 2 1 10
2 1 2
2 1 3
3 2 3 4
drkenさんのリストにProject Selection Problemの例題として挙がっていたので、そう言われればまあ……という感じだった。
Project Selection Problemについて