dividiere die Liste in zwei Teile, deren Summe am nächsten ist

8

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.

  1. init. Listen list1 = [], list2 = []
  2. Sortierelemente (angegebene Liste) [23 32 34 65 95 123 134]
  3. zuletzt (maximal)
  4. fügen Sie in die Liste ein, die sich weniger unterscheidet

Implementierung: list1 = [], list2 = []

  1. Wählen Sie 134 Einfügen Liste1. list1 = [134]
  2. Wählen Sie 123 Einfügen Liste2. weil, wenn Sie in die Liste1 einfügen, der Unterschied größer wird. 3. Wählen Sie 95 und fügen Sie list2 ein. weil sum (list2) + 95 - sum (list1) weniger ist.

und so weiter ...

    
Saeed Amiri 18.12.2010, 18:42
quelle

3 Antworten

4

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

konstruieren

A [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.

    
Saeed Amiri 18.12.2010, 19:27
quelle
7

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 .

    
Johan Kotlinski 18.12.2010 18:56
quelle
2

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.

  • Probieren Sie jede Möglichkeit aus, die Elemente in zwei Mengen zu partitionieren und berechnen Sie die absolute Differenz in den Summen.
  • Wählen Sie die Partition, für die die absolute Differenz minimal ist.

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.

    
Mark Byers 18.12.2010 18:54
quelle