この回答で述べたように、特定のコインの組み合わせは貪欲なアルゴリズムに適している可能性がありますが、貪欲さがすべてのコインの組み合わせに対して最適な組み合わせを提供するとは限りません。
Python (疑似コードの理想的な言語) での徹底的な再帰的ソリューションが続きます。
これにより、組み合わせではなく順列が得られることに注意してください。ただし、(組み合わせに関して) 重複を除外したい場合は、リストの作成後に簡単に並べ替えとフィルター処理を行うことができます。
また、大量の場合はかなり恐ろしいものになる可能性があることにも注意してください. たとえば、27 や 75 などの入力値の場合は 1 秒未満ですが、1024 の入力は、退屈してキャンセルするまでに少なくとも数分かかります)。
import sys
oldcount = 99999999
lst = []
def recurse (str, amt, count):
global oldcount
global lst
if amt < 0: return
if count > oldcount: return
if amt == 0:
if count < oldcount:
print "====="
lst = []
oldcount = count
if count == oldcount:
lst.append (str)
return
recurse ("%s 19" % str, amt - 19, count + 1)
recurse ("%s 13" % str, amt - 13, count + 1)
recurse ("%s 7" % str, amt - 7, count + 1)
recurse ("%s 1" % str, amt - 1, count + 1)
recurse ("", int (sys.argv[1]), 0)
#for seq in lst: print seq
print "%d permutations" % len (lst)
宗派{1, 7, 13, 19}
(この特定のケース) については、貪欲なアルゴリズムが最適であることに注意してください。その「証明」は(a)に従います。
1 から 6 までの任意の値に対して、その数のコインを使用する必要があり1
ます。これは、貪欲なアルゴリズムが提供するものです。
値が 7 から 12 の場合、その数の1
コインを使用するか、7
7 枚少ない1
コインを使用できます。貪欲なアルゴリズムは後者のケースを与えます。これは正しいです。なぜなら、71
枚のコインを取り除いて 1 枚のコインを追加する方が良いからです7
。つまり、コイン数が 6 減ります。
値が 13 から 18 の場合、a13
と aは使用できません。これ7
は最小値になるため、ミックスまたはミックス20
で行き詰まるからです(すべてのコインは前の段落と同じ理由でアウトです - 13 を交換します)。1 枚のコインのコイン数は大幅に減少します)。明らかに、13 の値に対する最善の賭けは 1 枚のコインですが、14 はどちらかまたは(両方とも 2 枚のコイン)で達成できます。次に、15 から 18 までの値は単純にコインが追加されます。13/1
7/1
1
1
13
13
7/7
13/1
1
同様に、19 の値は単一のコインであり、20 の値はまたは19
で表すことができます。21 から 37 までの値 (38の値の直前) は、前の 3 つの段落からの最小ミックスを加えたものです。19/1
13/7
19/19
19
したがって、選択された値 (1
と7
が異なる、7/7
== 13/1
、7/7/7
== 19/1/1
、13/7
==19/1
など) のため、貪欲なアルゴリズムはうまく機能します (ちなみに、これらの値がランダムに選択されたとは思いません。あまりにも便利です)。 )。
最小コイン数の表は次のとおりです。
Value Count Possibilities
1 1 1
2 2 1x2
3 3 1x3
4 4 1x4
5 5 1x5
6 6 1x6
7 1 7
8 2 7,1
9 3 7,1x2
:
12 6 7,1x5
13 1 13
14 2 13,1 or 7x2
15 2 13,1x2 or 7x2,1
:
18 6 13,1X5 or 7x2,1x4
19 1 19
20 2 19,1 or 13,7
21 3 19,1x2 or 13,7,1 or 7x3
:
等々。
(a)正式な証明ではありませんが、反例を示した最初の人に 20 の質問/回答に賛成票を投じるほど、私は正しいと確信しています (もちろん、質問と回答が完全なごみではない場合)。 - 投票プロセスが損なわれないように、それらは有用であると考えなければなりません)。