DP-Algorithmus für Bounded Knapsack?

8

Der Wikipedia-Artikel über das Knapsack-Problem enthält drei Arten davon:

  1. 1-0 (ein Element eines Typs)

  2. Begrenzt (mehrere Elemente eines Typs)

  3. Unbegrenzt (unbegrenzte Anzahl von Elementen eines Typs)

Der Artikel enthält DP-Ansätze für 1. und 3. Problemtypen, aber keine Lösung für 2.

Wie kann der dynamische Programmieralgorithmus zum Lösen von 2. beschrieben werden?

    
izhak 04.03.2012, 23:01
quelle

4 Antworten

6

Verwenden Sie die 0-1-Variante, aber ermöglichen Sie die Wiederholung eines Elements in der Lösung bis zu der Anzahl, die in seiner Begrenzung angegeben ist. Sie müssten einen Vektor pflegen, der angibt, wie viele Kopien jedes Elements Sie bereits in die Teillösung aufgenommen haben.

    
Irit Katriel 04.03.2012, 23:09
quelle
3

Ich habe einen Artikel zu Code Project gepostet, in dem eine effizientere Lösung für den begrenzten Rucksack diskutiert wird Algorithmus.

Aus dem Artikel:

  

In der dynamischen Programmierlösung ist jede Position des m-Arrays a   Teilproblem der Kapazität j. Im 0/1-Algorithmus für jedes Teilproblem   Wir betrachten den Wert des Hinzufügens einer Kopie jedes Artikels zum Rucksack.   Im folgenden Algorithmus betrachten wir für jedes Teilproblem den Wert   das Hinzufügen des kleineren der Menge, die passt, oder die Menge   für jeden Artikel verfügbar.

     

Ich habe auch den Code verbessert, damit wir bestimmen können, was in der   optimierter Rucksack (im Gegensatz zu nur dem optimierten Wert).

%Vor%

Der Download im Code Project-Artikel enthält einen Testfall.

    
ic3b3rg 14.01.2014 22:38
quelle
2
  • Speichern Sie zuerst alle Ihre Daten in einem einzigen Array (mit Wiederholung).
  • Verwenden Sie dann die erste im Wikipedia-Artikel erwähnte Methode (1-0).

Wenn Sie beispielsweise einen begrenzten Rucksack mit {2 (2-mal), 4 (3-mal), ...} versuchen, entspricht das einem 1-0-Rucksack mit {2, 2, 4, 4, 4 ,. ..}.

    
Deddy 24.11.2016 11:58
quelle
1

Ich werde Ihnen vorschlagen, den Knapsack Fraction Greedy Method Algorithm zu verwenden. Seine Komplexität ist O (n log n) und einer der besten Algorithmen. Unten habe ich seinen Code in c # erwähnt.

%Vor%     
Prince Sanghi 07.01.2015 12:11
quelle

Tags und Links