Obwohl das allgemeine Subset-Sum Problem NP-vollständig ist, gibt es spezielle Probleme (A, s), die schnell und einfach lösbar sind.
Definition:
Sei A = (a1, ..., an) ein Knapsack-Vektor.
A ist superansteigend (superincreasing), falls ai
größer ist als die Summe der vorhergehenden aj:
Zum Beispiel ist der Knapsack-Vektor A = (1, 2, 4, 8, 16) superansteigend.
Der folgende Algorithmus löst ein Problem (A, s), wenn A = (a1, a2, ..., an) superansteigend ist:
for i := n downto 1 | ||
if s >= ai then xi
:= 1 and s := s - ai
else xi := 0 |
||
if s != 0 then return (no solution)
else return (x1, x2, ..., xn). |
Dieser Algorithmus durchläuft linear die einzelnen Elemente von A und hat daher eine Laufzeit von O(n).
![]() |
Merkle-Hellman Kryptosystem | ![]() |