No.31

すべてのジュースは最低1リットル買わなければいけないので, 最初に買っておいて としておく. となった場合はすべてのジュースを等分にすればいい.

あるジュースを小数点以下のリットル使った場合, その他のジュースを小数点以下のリットル補わなければいけないので無駄となるので, すべて整数リットルで考えていい.

問題は,

の条件下で

として の最小値を求める問題となる.

ここで, 割合の小さいジュースから順に買うとすると, 番目のジュースを買うためには 番目のジュースも買わなければいけない. この考え方を使うと問題は

の条件下で

s.t.

として の最小値を求める問題に変形できる.

これはナップザック問題と似たような問題であるが DP で解くとなると の計算量となり間に合わない.

そこで単位単価 が最も安いジュースをなるべく多く買うようにする. このジュースを として, 以外のジュース リットル買うとすると, それよりは リットル買う方が総コストが安くなるので, リットル未満しか買わないことになる. すなわち, である.

また, 以外のジュースをあわせて 個買ったとし, それらを として,

と置くと, 鳩の巣原理より となる が存在し, このとき

となる. よって の倍数であるから, のジュースに置き換えられるので, 以外のジュースをあわせて 個以上買うことはない. したがって, 以外のジュースの総量は に抑えられ, 先の と合わせると DP の時間計算量は となる.