Wenn Sie das Problem auf eine etwas andere (aber äquivalente) Weise wiederholen, wird ein Algorithmus offensichtlicher:
Es sind Parteien beteiligt: n - 1 Personen und ein Restaurant. Lassen Sie p i die Menge des Geldes Partei i sollte nach dem Essen fertig ist und bezahlt. Zum Beispiel, wenn Alice 36 Dollar hat und 25 Dollar schuldet , Bob 12 Dollar hat und 11 Dollar schuldet und Carl 30 Dollar hat und 25 Dollar schuldet , sagen wir, dass p 0 das Restaurant ist und Folgendes hat:nn - 1pichichp0
p = ( 61 , 11 , 1 , 5 )
Das heißt, wenn das Essen vorbei ist, sollte das Restaurant 61 Dollar haben , Alice sollte 11 Dollar haben , Bob sollte 1 Dollar haben und Carl sollte 5 Dollar haben .
Nun lassen enumerate alle der m Rechnungen beteiligt. Beispielsweise:bm
b = ( 1 , 5 , 10 , 20 , 1 , 1 , 5 , 5 , 10 , 20 )
Die Stückelung der Scheine spielt keine Rolle, aber ich habe für dieses Beispiel die Stückelung der US-Papierwährung gewählt, weil sie vertraut ist.
Wir suchen die Anzahl der Rechnungen , die den Besitzer wechseln zu minimieren, so dass wir ein „Kosten“ mit der Person in Verbindung mit Rechnung verlassen j unter Verwendung eines { 0 , 1 } Matrix C . Einträge von 0 in dieser Matrix geben an, mit welchen Rechnungen jede Partei beginnt ( C 0 , j = 0 für alle j, da das Restaurant ohne Rechnungen beginnt).ichj{ 0 , 1 }CC0 , j= 0j
Fortsetzung unseres Beispiels:
C= ⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
zeigt an, dass Alice mit gestartet $ 1 $ 5, $ 10, $ Bob begann mit 20, $ 1 $ 1 $ 5, $ 5, und Carl begann mit $ 10 und $ 20.
Auch hier ist das Ziel, die Anzahl der Geldscheine, die den Besitzer wechseln, zu minimieren. Mit anderen Worten:
Minimieren:unterliegen:und∑i = 0n - 1∑j = 0m - 1Cich , jxich , j∑i = 0n - 1xich , j= 1 für 0 ≤ j < m ,∑j = 0m - 1xich , jbj= pich für 0 ≤ i < n ,xich , j≥ 0
Die erste Einschränkung besagt, dass die Lösung nur einer Partei eine bestimmte Rechnung zuweisen kann, und die zweite stellt sicher, dass jeder den entsprechenden Betrag zahlt.
Dies ist das 0,1 INTEGER PROGRAMMING-Problem und ist NP-vollständig (siehe [ Karp 1972 ]). Die Wikipedia-Seite über lineare Programmierung enthält Informationen zu verschiedenen Algorithmen, die für diese Art von Problemen verwendet werden können.
Es gibt möglicherweise mehrere optimale Lösungen. Die erste Lösung für das Beispiel, das ich mir ausgedacht habe, war:
x = ⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
was bedeutet , Alice zahlt genau $ 5 und $ 20, Bob genau zahlt $ 1 $ 5 und $ 5, und Carl viel bezahlt $ 10 und $ 20 und dann entfernt einen $ 5 aus der Tabelle.
Ich habe auch das Mixed Integer Linear Program-Modul des Sage Math- Systems verwendet, das die Möglichkeit bietet, verschiedene Solver-Backends ( GLPK , COIN , CPLEX oder Gurobi ) zu verwenden. Die erste Lösung war
x = ⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
Das ist fast das Gleiche, außer dass Carl die "anderen" $ 5 nahm, die Bob auf den Tisch legte.
Cx
Identifizieren Sie eine Untergruppe von Personen, die den reduzierten Gesamtbetrag bezahlen können? Oder vielleicht eine Untergruppe von Leuten, die noch die gesamte Rechnung bezahlen könnten, dh sie bezahlen für ihren Freund.
Ihre abschließende Aussage lässt den Anschein erwecken, dass Sie an dem Fall interessiert sind, dass die Nennwerte der Scheine festgelegt sind. Dies ändert jedoch nichts am Problem.
O ( 1 )