Dies ist ein Wiederholungsproblem. Vorgegeben eine Menge von Münzen {Cn, Cn-1, . . ., 1}
, so daß für 1 <= k <= n, Ck > Ck-1
, wird der Greedy - Algorithmus die minimale Anzahl von Münzen ergeben , wenn Ck> Ck-1 + Ck-2 und für den Wert V=(Ck + Ck-1) - 1
, den Greedy - Algorithmus auf die Teilmenge von Münzen Anwendung {Ck, Ck-1, . . ., 1}
, wobei die Ck <= V
Ergebnisse in weniger Münzen als die Zahl, die sich aus der Anwendung des Greedy-Algorithmus auf die Teilmenge der Münzen ergibt {Ck-1, Ck-2, . . ., 1}
.
Der Test ist einfach: Für `1 <= k <= n Test die Anzahl der Münzen, die der Greedy-Algorithmus für einen Wert von Ck + Ck-1 - 1 ergibt. Führen Sie dies für den Münzsatz {Ck, Ck-1 ,. . ., 1} und {Ck-1, Ck-2 ,. . ., 1}. Wenn für ein k das letztere weniger Münzen ergibt als das erstere, funktioniert der Greedy-Algorithmus für diesen Münzsatz nicht.
Betrachten Sie beispielsweise mit n = 4 den Münzsatz {C4, C3, C2, 1} = {50,25,10,1}. Beginnen Sie mit k = n = 4, dann V = Cn + Cn-1 - 1 = 50 + 25-1 = 74 als Testwert. Für V = 74 ist G {50,25,10,1} = 7 Münzen. G {25, 10, 1} = 8 Münzen. So weit, ist es gut. Nun sei k = 3. dann ist V = 25 + 10-1 = 34. G {25, 10, 1} = 10 Münzen, aber G {10, 1} = 7 Münzen. Wir wissen also, dass der Greedy-Algorithmus die Anzahl der Münzen für den Münzsatz {50,25,10,1} nicht minimiert. Wenn wir andererseits diesem Münzsatz ein Nickel hinzufügen, ist G {25, 10, 5, 1} = 6 und G {10, 5, 1} = 7. Ebenso gilt für V = 10 + 5-1 = 14 erhalten wir G {10, 5, 1} = 5, aber G {5,1} = 6. Wir wissen also, dass Greedy für {50,25,10,5,1} arbeitet.
Das wirft die Frage auf: Wie sollte der Nennwert von Münzen lauten, um den Greedy-Algorithmus zu erfüllen, der die kleinste Anzahl von Münzen im ungünstigsten Fall für einen Wert von 1 bis 100 ergibt? Die Antwort ist ganz einfach: 100 Münzen mit jeweils unterschiedlichen Werten von 1 bis 100. Dies ist wahrscheinlich nicht sehr nützlich, da bei jeder Transaktion linear nach Münzen gesucht wird. Ganz zu schweigen von den Kosten, so viele verschiedene Stückelungen zu prägen und zu verfolgen.
Wenn wir nun primär die Anzahl der Stückelungen minimieren wollen, während wir sekundär die resultierende Anzahl von Münzen für einen von Greedy produzierten Wert von 1 bis 100 minimieren wollen, dann Münzen in Stückelungen von Potenzen von 2: {64, 32, 16, 8, 4 , 2, 1} ergeben maximal 6 Münzen für einen Wert von 1: 100 (die maximale Anzahl von Einsen in einer Sieben-Bit-Zahl, deren Wert kleiner als 100 ist). Dies erfordert jedoch 7 Stückelungen Münze. Der schlechteste Fall für die fünf Nennwerte {50, 25, 10, 5, 1} ist 8, was bei V = 94 und V = 99 auftritt. Münzen mit Potenzen von 3 {1, 3, 9, 27, 81} erfordern auch nur 5 Stückelungen, um von Greedy gewartet werden zu können, ergeben jedoch auch einen Worst-Case von 8 Münzen mit Werten von 62 und 80. Verwenden Sie schließlich eine der fünf Stückelungen Teilmenge von {64, 32, 16, 8, 4, 2, 1}, die '1' nicht ausschließen kann und die Greedy erfüllt, führt auch zu maximal 8 Münzen. Es gibt also einen linearen Kompromiss. Durch Erhöhen der Anzahl der Stückelungen von 5 auf 7 wird die maximale Anzahl von Münzen verringert, die erforderlich sind, um einen Wert zwischen 1 und 100 von 8 auf 6 darzustellen.
Wenn Sie andererseits die Anzahl der zwischen einem Käufer und einem Verkäufer ausgetauschten Münzen minimieren möchten , vorausgesetzt, jede hat mindestens eine Münze jeder Stückelung in der Tasche, entspricht dieses Problem den geringsten Gewichten, die zum Ausgleichen erforderlich sind Gewicht von 1 bis N Pfund. Es stellt sich heraus, dass die geringste Anzahl von Münzen, die bei einem Kauf umgetauscht werden, erreicht wird, wenn die Münzwerte in Potenzen von 3 angegeben werden : {1, 3, 9, 27, . . .}
.
Siehe /puzzling/186/whats-the-fewest-weights-you-need-to-balance-any-weight-from-1-to-40-pounds .