Dies ist ein schwer -Algorithmusproblem, das:
Teilen Sie die Liste in 2 Teile (Summe) auf, deren Summe sich am nächsten zueinander befindet (am meisten)
Listenlänge ist 1 & lt; = n & lt; = 100 und ihre (Zahlen) Gewichte 1 & lt; = w & lt; = 250 in der Frage gegeben.
Zum Beispiel: 23 65 134 32 95 123 34
1.sum = 256
2.sum = 250
1. Liste = 1 2 3 7
2. Liste = 4 5 6
Ich habe einen Algorithmus, aber es hat nicht für alle Eingaben funktioniert.
Implementierung: list1 = [], list2 = []
und so weiter ...
Das Problem ist NPC, aber es gibt einen Pseudo-Polynomalgorithmus dafür, das ist ein 2-Partition Problem, Sie können den Weg des Pseudo-Polynom-Zeitalgorithmus für Subset-Summe verfolgen, um dieses Problem zu lösen. Wenn die Eingabegröße polynomisch mit Eingabewerten in Beziehung steht, kann dies in Polynomialzeit erfolgen.
In Ihrem Fall (Gewichte & lt; 250) ist es polynomisch (weil Gewicht & lt; = 250 n = & gt; Summen & lt; = 250 n ^ 2).
Sei Summe = Summe der Gewichte, wir müssen ein zweidimensionales Array A erstellen und dann A, Column by Column
konstruierenA [i, j] = wahr if (j == Gewicht [i] oder j - Gewicht [i] = Gewicht [k] (k ist in der Liste)).
Die Erstellung eines Arrays mit diesem Algorithmus erfordert O (n ^ 2 * sum / 2).
Endlich sollten wir die wertvollste Spalte finden, die einen wahren Wert hat.
Hier ist ein Beispiel:
Artikel: {0,1,2,3} Gewichte: {4,7,2,8} = & gt; Summe = 21 Summe / 2 = 10
%Vor%Also, weil a [10, 2] == wahr ist die Partition 10, 11
Dies ist ein Algorithmus, den ich hier gefunden und ein wenig bearbeitet habe, um ihn zu lösen Dein Problem:
%Vor%Ich habe gerade zuerst T [i] zurückgegeben, was wahr ist, anstatt T [N / 2] (in der Reihenfolge von max zu min) zurückzugeben.
Den Pfad zu finden, der diesen Wert liefert, ist nicht schwer.
Sie können dies als Rucksackproblem umformulieren.
Sie haben eine Liste von Artikeln mit dem Gesamtgewicht M, die in einen Behälter mit maximalem Gewicht M / 2 passen sollten. Die in den Behälter gepackten Gegenstände sollten so viel wie möglich wiegen, aber nicht mehr, als der Behälter fasst.
Für den Fall, dass alle Gewichte nicht negativ sind, ist dieses Problem nur schwach NP-vollständig und hat polynomielle Zeitlösungen.
Eine Beschreibung der dynamischen Programmierlösungen für dieses Problem finden Sie auf Wikipedia .
Dieses Problem ist mindestens so schwierig wie das NP-vollständige Problem Teilmengensumme . Ihr Algorithmus ist ein Greedy-Algorithmus. Diese Art von Algorithmus ist schnell und kann schnell eine ungefähre Lösung generieren, aber sie kann nicht die exakte Lösung für ein NP-vollständiges Problem finden.
Ein Brute-Force-Ansatz ist wahrscheinlich der einfachste Weg, um Ihr Problem zu lösen, obwohl es zu langsam ist, wenn zu viele Elemente vorhanden sind.
Das Generieren aller Partitionen kann durch Berücksichtigung der Binärdarstellung jeder Ganzzahl von 0 bis 2 ^ n erfolgen, wobei jede Binärziffer festlegt, ob sich das entsprechende Element in der linken oder rechten Partition befindet.
Tags und Links algorithm dynamic-programming knapsack-problem partition-problem