問題
くだもの屋さんで、ミカンが $ x $ 個 $ a $ 円、 $ y $ 個 $ b $ 円、 $ z $ 個 $ c $ 円で売られています。
ミカンの買い方を工夫したとき、$ n $ 個のミカンを買うために必要な金額の最小値はいくらでしょうか。
(買い方を工夫した結果、買ったミカンが $ n + 1 $ 個以上になってもよいものとします。)
[条件]
🔹 $ x < y < z $
🔹 $ 1 \leqq n,x,y,z,a,b,c \leqq 1000 $
解法・ソースコード
memo[n] をちょうど $ n $ 個のミカンを買うのに必要な金額の最小値とすると、memo[0] ~ memo[k-1] と memo[k]
の関係は memo[k] = min(memo[k - x] + a, memo[k - y] + b、memo[k - z] + c)
となります。
memo を添字が大きい方から memo[k] = min(memo[k], memo[k + 1])
のように書き換えていけば、memo[n] が $ n $ 個以上のミカンを買うのに必要な金額の最小値となります。
$ n $ 個のミカンを最も安く手に入れたいときに $ n+z $ 個以上のりんごを買うのは無意味なので、memo は memo[n + z - 1]
程度まで計算しておけば大丈夫です。
[Google Colaboratory]
1 | #--------- 入力例1 ---------- |
[実行結果(入力例1)]
解: 375
3個125円のミカンを、3回分買うとトータル9個のミカンを 最小金額 375円 で買うことができます。
[実行結果(入力例2)]
解: 2810
703個2810円のミカンを、1回分買うとトータル145個のミカンを 最小金額 2810円 で買うことができます。