Mark lebt in einem winzigen Land, in dem Menschen leben, die dazu neigen, Dinge zu überdenken. Eines Tages beschließt der König des Landes, die Währung des Landes neu zu gestalten, um Veränderungen effizienter zu gestalten. Der König möchte die erwartete Anzahl von Münzen minimieren, die erforderlich sind, um einen beliebigen Betrag bis zum Betrag der kleinsten Papierrechnung genau zu bezahlen (jedoch nicht einzuschließen).
Angenommen, die kleinste Währungseinheit ist die Münze. Die kleinste Papierrechnung im Königreich ist Münzen wert . Der König beschließt, dass nicht mehr als verschiedene Münzwerte im Umlauf sein dürfen. Das Problem besteht also darin, eine Menge von ganzen Zahlen aus was 1 minimiertvorbehaltlich.
Nehmen Sie zum Beispiel den Standard-USD und seine Münzwerte von . Hier ist die kleinste Papierrechnung 100 der kleinsten Münze wert. Mit dieser Währung werden 4 Münzen benötigt, um 46 Cent zu verdienen. wir haben c 1 ( 46 ) = 1 , c 2 ( 46 ) = 0 , c 3 ( 46 ) = 2 , c 4 ( 46 ) = 1 , c 5 . Wenn wir jedoch Münzwerte von { 1 , 15 , 30 } hätten , würden nur 3 Münzen benötigt: c 1 ( 46 ) = 1 , c 2 ( 46 ) = 1 , c 3 ( 46 ) = 1 . Welcher dieser Nennwertsätze minimiert die durchschnittliche Anzahl von Münzen, um eine Summe von bis zu 99 Cent zu erhalten?
Allgemeiner , wie könnte man bei n und m algorithmisch die optimale Menge bestimmen? Es ist klar, dass man alle realisierbaren m- Teilmengen aufzählen und die durchschnittliche Anzahl von Münzen berechnen kann, die erforderlich sind, um Summen von 1 bis n - 1 zu erzielen , wobei die optimale auf dem Weg verfolgt wird. Da es ungefähr C ( n - 1 , m ) m- Teilmengen gibt (von denen nicht alle lebensfähig sind, aber immer noch), wäre dies nicht besonders effizient. Kannst du es besser machen?
quelle
Antworten:
Dies hängt mit dem bekannten Problem der Änderung zusammen . In der Tat so gut untersucht, dass diese Frage mit brutaler Gewalt für [1] untersucht wurde. Ab 2003 scheint die Schwierigkeit, optimale Stückelungen zu finden, ein offenes Problem zu sein.m≤7
Wenn Sie die Artikel überprüfen , in denen Shallit zitiert wird , scheint es, als wären Konfessionen von besonderem Interesse, die gierige Strategien zur Veränderung ermöglichen. Es ist klar, dass solche Bezeichnungen in der Praxis Vorteile haben.
quelle
Ich vermutete (zu Unrecht, aber ertrage es mit mir), dass die Serie von Münzen wäre das Optimum, da die Münzen exponentiell beabstandet wären, wodurch der verbleibende Wert pro hinzugefügter Münze so weit wie möglich verringert würde. In Ihrem Beispiel wäre dies { 1 , 3 , 9 , 27 , 81 } .{ bich| b=⌈ n 1 / m⌉ , 0 ≤ i < m } { 1 , 3 , 9 , 27 , 81 }
Dies ist eine Kerbe besser ( ) als die USD Stückelung ( 420 / 99 ), aber das muss nicht alles bedeuten.390 / 99 420 / 99
Ich habe ein hackiges Haskell-Skript geschrieben, um einige Zahlen mit brutaler Gewalt zu erhalten, da ich mir derzeit nicht sicher bin, wie ich das analytisch angehen soll.( m , n ) = ( 4 , 30 ) 75 / 29 { 20 , 8 , 3 , 1 } 87 / 29 {27,9,3,1} . Meine träge Maschine kann nicht auf , daher müssen wir hier kleinere Zahlen verwenden.(5,100)
Es stellt sich heraus, die exponentielle Verteilung ist nicht immer die beste: Es gibt manchmal etwas bessere, zum Beispiel für erhalten wir 75 / 29 für { 20 , 8 , 3 , 1 } aber 87 / 29 für { 27 , 9 , 3 , 1 }
Mir ist jedoch aufgefallen, dass der Fehler recht klein zu sein scheint. Meistens ergibt die Aufteilung der Summen etwas, das mit 1,0 ... beginnt, also habe ich noch einige Tests durchgeführt.
Aus einem Testsatz mit und 6 ≤ n ≤ 40 erhalten wir einen durchschnittlichen Fehler unseres exponentiellen Wachstums im Vergleich zur besten Lösung von 1,12 mit einer Standardabweichung von 0,085 .3≤m≤5 6≤n≤40 1.12 0.085
Sie könnten argumentieren, dass die Testparameter eher klein sind, aber wie Sie betonen, ist es nur eine Menge Brute Force, wenn Sie (es gibt höchstwahrscheinlich eine bessere Lösung, aber dies war eine ausgezeichnete Ausrede, um nachzulassen und etwas zu tun Haskell).n=100
Hier ist meine Testsuite, wenn Sie sie ausprobieren möchten:
Ich habe den Test mit durchgeführt
quelle