ABC231 Minimal payments
解説AC
お釣りの問題は過去出題例があります。
過去問では、
を参考にしました。
この解説と公式解説を踏まえ、まずは解法を書きます。
例として、
X = 35
A = {1,4,12}
を考えます。
を円払うために必要な最小の硬貨の枚数
と定義します。
は、1円玉でしかやり取りできません。
・1円硬貨で3円払って32円払う問題とする
・1円硬貨を使わず、おつりとして1円を受け取ることを確定させ、36円を払う問題とする
ことができます。
よって、35円を払うのに必要な最小枚数は、
となります。
同様に、は以下のように計算できます。
そして、というように計算できます。
各硬貨を考慮したときには、
・X以下の最小のの倍数。(ここではとします。)
・X以上の最大のの倍数。(ここではとします。)
の2パターンしか現れません。
そこで、以下のDPを考えます。
j=0のとき、円払うのに必要な硬貨の最小枚数
j=1のとき、円払うのに必要な硬貨の最小枚数
初期値は、
です。
漸化式は、
これを金額が大きい順に計算しておくと、答えは(または。等しくなるはず)です。
「はの倍数である」がよくわからなかったこともあり、数直線で考えてみました。
下記の表はの倍数でいける座標(円硬貨で払える金額)を示したものです。
表を見ると分かるように、の倍数であるという制約により、4円硬貨で支払えない金額は、12円硬貨でも払えません。
したがって、
・で得られる端数は、円以下の硬貨で支払うしかない
ことが言えます。
また、
・DPの過程で、円硬貨で支払う金額、、、、が、の倍数である
ことが保証されます。
この問題は、以下のように数直線上を移動する問題に言い換えができそうです。
0から始まり正の方向に無限に伸びる数直線があり、その数直線上を点0から点Xまで移動することを考える。
だけ、進むか戻ることができるとき、操作回数は最小で何回か。
数直線上を移動する問題においても、
・値の大きい方から移動した方が効率が良い
・Xに最も近いの倍数、すなわちまたはのみに移動すればよく、他は無駄である
・考慮する移動方法は、
・からまたはに行く
・からまたはに行く
ことから、元の問題と同様に解けるかなと思います。