Problembeschreibung
Gegeben sei eine Menge von ganzen Zahlen
.
Gesucht ist eine Untermenge, deren Elementsumme maximal, aber nicht größer als eine gegebene obere Schranke
ist (oft ist auch gefragt, die Schranke
exakt zu erreichen).
Formal: Gesucht sind
, die
maximieren unter der Nebenbedingung
.
NP-Vollständigkeit
Das Problem ist NP-vollständig und somit vermutlich nicht effizient lösbar.
Es kann mit der Branch-and-Bound-Methode gelöst werden.
Der Beweis der NP-Schwere erfolgt durch eine Reduktion von 3-SAT. Für eine gegebene Klauselmenge
mit den Variablen
werden die Dezimalzahlen
sowie die Schranke
anhand einer Tabelle konstruiert. Es wird vorausgesetzt, dass keine Klauseln vorhanden sind, die
und
gleichzeitig enthalten; dies ist keine Einschränkung, da eine solche Klausel immer erfüllt wäre und somit weggelassen werden kann, ohne den Sinn zu verändern.
Beispielsweise wird die Formel
wie folgt verarbeitet (eine Erklärung folgt nach der Tabelle).
|
 |
 |
 |
 |
 |
 |
 |
1 |
0 |
0 |
1 |
1 |
0 |
 |
1 |
0 |
0 |
0 |
0 |
1 |
 |
0 |
1 |
0 |
0 |
1 |
0 |
 |
0 |
1 |
0 |
1 |
0 |
1 |
 |
0 |
0 |
1 |
1 |
1 |
0 |
 |
0 |
0 |
1 |
0 |
0 |
1 |
 |
0 |
0 |
0 |
1 |
0 |
0 |
 |
0 |
0 |
0 |
2 |
0 |
0 |
 |
0 |
0 |
0 |
0 |
1 |
0 |
 |
0 |
0 |
0 |
0 |
2 |
0 |
 |
0 |
0 |
0 |
0 |
0 |
1 |
 |
0 |
0 |
0 |
0 |
0 |
2 |
 |
1 |
1 |
1 |
4 |
4 |
4 |
- Die Ziffern einer Zeile werden als Stellen einer Dezimalzahl aufgefasst.
- Die ersten 2n Zeilen sind lediglich eine Codierung der Formel selbst:
besagt, dass
in den Klauseln
und
, aber nicht
vorkommt.
setzt das für
um,
für
,
für
etc.
- Die Zeilen
bis
sind "Korrekturzeilen", die nur auf der Diagonalen jeweils abwechselnd den Wert 1 oder 2 haben.
- Die Zahl
besteht nur aus n Einsen und m Vieren. Dies bewirkt, dass bei Addition der Spaltenwerte, an den ersten n Stellen nur entweder
oder
;
oder
etc. ausgewählt werden kann, wodurch in der Formel
auf true oder false gesetzt wird. Die Vieren sind so gewählt, dass zusätzlich zu den beiden Korrekturwerten, die zusammen nur 1+2=3 ergeben, noch mindestens eine der Variablen in den Klauseln vorhanden sein muss, um auf 4 zu kommen. Sind mehr Variablen verfügbar, können entsprechend Korrekturzeilen weggelassen werden.
Besitzt nun die boolesche Formel eine erfüllende Belegung, so nehmen wir falls
=true die Zahl
auf; falls
=false die Zahl
. Damit sind schon die Einsen in
korrekt. Da alle Klauseln erfüllt sind, ist in den gerade hinzugefügten Zahlen in jeder Klausel mindestens eine erfüllte Variable vorhanden, somit sind die Spaltensummen im rechten Teil schon mindestens 1 und höchstens 3. Nun muss man nur noch die Korrekturvariablen geeignet wählen, um auf 4 zu kommen. Mit der konstruierten Menge ist es so möglich, genau
zu erreichen, wenn die Formel erfüllbar ist.
Wenn nun
genau erreicht werden kann, so muss die Teilmenge der
zunächst jeweils genau ein
oder
;
oder
etc. enthalten, weil sonst die Einsen in
nicht erfüllt wären. Somit ist gewährleistet, dass eine Variable tatsächlich true oder false (und nicht keins oder beides) ist. Durch diese Auswahl der Teilmenge muss dann auch jede Klausel erfüllt sein, denn wenn in einer Klausel keine Variable durch die Belegung erfüllt wäre, so würde die Addition nicht die notwendige Vier in
ergeben. Daher ist die boolesche Formel insgesamt erfüllbar.