マツシタのお勉強

AtCoder ABC D - Mixing Experiment

問題

D: Mixing Experiment - AtCoder Beginner Contest 054 | AtCoder

解き方

全列挙を考える

全列挙する場合、i番目の薬品を購入する場合としない場合を2パターンをN回行うので、計算量はO(2N)となりNは最大40なので間に合わない。

動的計画法を使う

dp(i, x, y)を以下のように定義する。

dp(i, x, y) := {i番目までの薬を使用した時、物質aの和がx, bの和がyとなる、最小コスト}

漸化式を立てる

dp(i, x, y)は漸化式を用いて次のように表す事ができる。

dp(i, x, y) = min(dp(i - 1, x, y), dp(i - 1, x - a[i], y - b[i]) + cost[i])

後は配列のインデックスがOutOfRangeしないようにfor文を回してあげる。するとi に N - 1 を代入したdp[N - 1][x][y]は、全ての薬品を考慮した時のx, yのコストを取得することができる。あとは、与えられた比となるx, yを見ていき最小コストを出力してあげる。

ソースコード