コインのセットが与えられた場合、可能な限り最適な方法で特定の金額に到達するにはどうすればよいでしょうか?
この場合、1、5、10、20、50 セントのコインの乱数があり、最大のコインが優先されるとします。
私の最初の直感は、収まる最大のコインをすべて使用し、合計を超えた場合は次に小さいコインを使い切るというものです。
これでうまくいきますか、それともこのアプローチに何か欠点がありますか? より効率的なアプローチはありますか?
コインのセットが与えられた場合、可能な限り最適な方法で特定の金額に到達するにはどうすればよいでしょうか?
この場合、1、5、10、20、50 セントのコインの乱数があり、最大のコインが優先されるとします。
私の最初の直感は、収まる最大のコインをすべて使用し、合計を超えた場合は次に小さいコインを使い切るというものです。
これでうまくいきますか、それともこのアプローチに何か欠点がありますか? より効率的なアプローチはありますか?
最初に最大のコインを配るだけでは不十分です。
自動販売機が 50c、20c、1c の各 20 枚を除くすべてのコインを使い果たし、60c の釣り銭を提供する必要があるとします。
「最大優先」(または貪欲)方式では、11 枚のコイン、1 枚の 50c コイン、10 枚の 1c コインが得られます。
より良い解決策は、3 枚の 20c コインです。
貪欲なスキームは、局所的な最適解のみを提供します。グローバルな最適化の場合、通常はすべての可能性を調べて (検索スペースを減らすためのミニマックス タイプのアルゴリズムが存在する場合もあります)、変更を提供するために通常は計算可能性の範囲内にあることを確認する必要があります。
最大の額面を使い果たすという仮定は、毎回最良の解決策ではありません。例:
Input: coins[] = {25, 10, 5}, V = 30
Output: Minimum 2 coins required
We can use one coin of 25 cents and one of 5 cents
Input: coins[] = {9, 6, 5, 1}, V = 11
Output: Minimum 2 coins required
We can use one coin of 6 cents and 1 coin of 5 cents (min)
As per logic of exhausting largest coins first, we would end up with one
coin of 9 cents and 2 coins of 1 cent
詳細については、この回答を参照してください。