Algorithmus zum Aufteilen einer Liste von Zahlen in 2 gleiche Summenlisten
Gibt es eine Liste von zahlen.
Die Liste ist aufgeteilt in 2 gleich große Listen, mit einem minimalen Unterschied in der Summe. Die Summen ausgedruckt werden.
#Example:
>>>que = [2,3,10,5,8,9,7,3,5,2]
>>>make_teams(que)
27 27
Ist es ein Fehler im folgenden code-Algorithmus für einen Fall?
Wie kann ich optimieren und/oder pythonize?
def make_teams(que):
que.sort()
if len(que)%2: que.insert(0,0)
t1,t2 = [],[]
while que:
val = (que.pop(), que.pop())
if sum(t1)>sum(t2):
t2.append(val[0])
t1.append(val[1])
else:
t1.append(val[0])
t2.append(val[1])
print min(sum(t1),sum(t2)), max(sum(t1),sum(t2)), "\n"
Frage ist von http://www.codechef.com/problems/TEAMSEL/
InformationsquelleAutor der Frage Lakshman Prasad | 2009-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neue Lösung
Dies ist eine Breite-zuerst-Suche mit Heuristiken, die culling. Der Baum ist begrenzt bis zu einer Tiefe von Spieler/2. Der Spieler Summe limit ist totalscores/2. Mit einem Spieler-pool 100, dauerte es ungefähr 10 Sekunden zu lösen.
Beachten Sie auch, dass ich versuchte, dies zu lösen, mit GS s Beschreibung, aber es ist unmöglich, genügend Informationen einfach, indem die Gesamtsummen. Und wenn Sie gespeichert beide die Anzahl der Elemente und der Summen, dann es wäre das gleiche, als diese Lösung, außer Sie gehalten unnötig Daten. Weil Sie nur benötigen, um die n-1 und n-Iterationen bis zu numplayers/2.
Hatte ich eine alte erschöpfend basiert auf binomial-Koeffizienten (Blick in die Geschichte). Es löste das Beispiel Probleme mit der Länge 10 ganz gut, aber dann sah ich, dass der Wettbewerb mussten die Menschen bis zu der Länge 100.
InformationsquelleAutor der Antwort Unknown
Dynamische Programmierung ist die Lösung, die Sie suchen.
Beispiel mit [4, 3, 10, 3, 2, 5]:
12 ist unsere Glückszahl! Backtracing, um die Gruppe:
Der andere kann dann berechnet werden,: {4,3,10,3,2,5} - {5,3,4} = {10,3,2}
Alle Felder mit einer Zahl sind mögliche Lösungen für eine Tasche. Wählen Sie die eins, die am weitesten in der unteren rechten Ecke.
BTW: Es heißt, die knapsack-problem.
InformationsquelleAutor der Antwort Georg Schölly
Gut, Sie können eine Lösung finden, um eine prozentuale Genauigkeit in polynomialer Zeit, aber tatsächlich finden die optimale (absoluter minimaler Unterschied) Lösung, das problem ist NP-vollständig. Dies bedeutet, dass es keinen polynomialzeit-Lösung für das problem. Als Ergebnis, auch mit einer relativ kleinen Liste von zahlen, es ist zu Rechen-intensiv zu lösen. Wenn Sie wirklich brauchen eine Lösung, nehmen Sie einen Blick auf einige der approximation algorithmen für diese.
http://en.wikipedia.org/wiki/Subset_sum_problem
InformationsquelleAutor der Antwort Sean Turner
F. Gegeben multiset S von ganzen zahlengibt es eine Möglichkeit, die partition S in zwei Teilmengen S1 und S2, so dass die Summe der zahlen in S1 gleich der Summe der zahlen in S2?
A.Set Partition Problem.
Viel Glück heranführen. : )
InformationsquelleAutor der Antwort unj2
Beachten Sie, dass es auch einen heuristischen und ich zog die Art aus der Funktion heraus.
InformationsquelleAutor der Antwort odwl
Es ist eigentlich PARTITION, ein Spezialfall von KNAPSACK.
Ist es NP-Vollständige, mit pseudo-Polynom dp-algorithmen. Die pseudo in pseudo-polynomialer bezieht sich auf die Tatsache, dass die Laufzeit hängt von der Auswahl der GEWICHTE.
Im Allgemeinen müssen Sie zunächst entscheiden, ob es eine exakte Lösung zu finden, bevor Sie zugeben, eine heuristische Lösung.
InformationsquelleAutor der Antwort klochner
Einen Testfall, wo Ihre Methode nicht funktioniert, ist
Das problem ist, dass Sie analysieren die Dinge in Paaren, und in dieses Beispiel, Sie wollen alle den 50er Jahren in der gleichen Gruppe. Dieses sollte gelöst werden, obwohl, wenn Sie entfernen Sie die pair-Analyse Aspekt und mache nur einen Eintrag.
Hier ist der code, der dies tut
Diese geben 27 -, 27-und 150, 1002, das sind die Antworten, die für mich Sinn machen.
Edit: Im Rückblick finde ich, dass dies nicht wirklich funktionieren, aber am Ende, ich bin mir nicht ganz sicher, warum. Ich werde nach meinem test code hier, aber, wie könnte es nützlich sein. Der test erzeugt zufällige Sequenz, die haben die gleichen Summen, setzt diese zusammen und vergleicht (mit den traurigen Ergebnissen).
Edit #2: Sitz in der Beispiel darauf hingewiesen, von Unbekannten,
[87,100,28,67,68,41,67,1]
es ist klar, warum meine Methode nicht funktioniert. Speziell, um dieses Problem zu lösen. B. die zwei größten zahlen müssen Hinzugefügt werden, um die gleiche Reihenfolge, um eine gültige Lösung.InformationsquelleAutor der Antwort tom10
Offenbar sind Sie auf der Suche für eine dynamische Programmierung Rucksack-Lösung. So, nachdem mein Erster Versuch (einen ziemlich guten original-Heuristik dachte ich), und mein zweiter Versuch (eine wirklich hinterhältige exakte kombinatorische Lösung, arbeitete für kurz-Daten-sets, und sogar für Mengen bis zu 100 Elemente, solange die Anzahl der einzigartige Werte niedrig war) Ich erlag schließlich dem Gruppendruck und schrieb die eine, die Sie wollten (nicht zu hart - Handhabung von duplizierten Einträgen war der schwierigste Teil - die zugrunde liegenden algorithmen I basiert es auf funktioniert nur, wenn alle Eingaben eindeutig sind - ich bin sicher froh, dass lange ist groß genug für 50 bits!).
Also für alle test-Daten und umständlich Rand Fälle, die ich zusammen beim testen meine ersten zwei versuche, es gibt die gleiche Antwort. Zumindest für die, die ich überprüft, die mit der kombinatorischen solver, ich wissen sind Sie richtig. Aber ich bin mir noch immer nicht, die Vorlage mit einigen falschen Antworten!
Ich verlange nicht für jeden fix meinen code hier, aber ich wäre sehr dankbar wenn sich jemand finden können, ein Fall, für den der code unten erzeugt die falsche Antwort.
Dank,
Graham
PS Dieser code wird immer ausgeführt, innerhalb der Frist, aber es ist weit aus optimiert. ich bin es einfach zu halten, bis der test bestanden, dann habe ich ein paar Ideen, um ihn zu beschleunigen, vielleicht um einen Faktor 10 oder mehr.
InformationsquelleAutor der Antwort Graham Toal
InformationsquelleAutor der Antwort Aaron Maenpaa
Für die Leistung, die Sie speichern, Berechnungen durch ersetzen von append() und Summe() mit den Gesamtsummen.
InformationsquelleAutor der Antwort Glenn
Konnten Sie ziehen Sie die Schleife bis ein wenig mithilfe der folgenden:
InformationsquelleAutor der Antwort leif
Da die Listen muss mir gleich das problem nicht NP überhaupt.
Aufgeteilt ich die sortierte Liste mit dem Muster t1<-que(1., Letzte), t2<-que(2., last-1) ...
Bearbeiten: ich nehme an, dass dies auch eine falsche Methode. Falsche Ergebnisse!
InformationsquelleAutor der Antwort Nick Dandoulakis
Nach einiger überlegung für nicht allzu großes problem, ich denke, dass die beste Art von Heuristiken wird so etwas wie:
Können Sie einstellen, nb_iter wenn das problem größer ist.
Es löst das oben erwähnte problem meist alle mal.
InformationsquelleAutor der Antwort odwl
In einem früheren Kommentar habe ich die Hypothese aufgestellt, dass das problem wie war lenksam, weil Sie hatte sorgfältig ausgewählten Testdaten, um die Kompatibilität mit verschiedenen algorithmen in der Zeit alloted. Es stellte sich heraus nicht der Fall zu sein - stattdessen ist es die problem-Einschränkungen - zahlen nicht höher als 450, und eine Letzte Gruppe, die nicht größer als 50 zahlen ist der Schlüssel. Diese sind kompatibel mit der Lösung des Problems mit Hilfe der dynamischen Programmierung Lösung, die ich in einem späteren post. Keiner der anderen algorithmen (Heuristiken, oder abschliessende Aufzählung durch eine kombinatorische Muster generator) kann möglicherweise funktionieren, denn es werden Testfälle groß genug oder hart genug zu brechen diese algorithmen. Es ist ziemlich nervig um ehrlich zu sein, weil die anderen Lösungen sind mehr herausfordernden und sicherlich mehr Spaß. Beachten Sie, dass ohne eine Menge zusätzlicher Arbeit, die dynamische Programmierung Lösung sagt nur, ob eine Lösung möglich ist, mit N/2 für eine gegebene Summe, aber es sagt Ihnen nicht, den Inhalt entweder partition.
InformationsquelleAutor der Antwort Graham Toal