Dem Algorithmus zur Lösung des Teilsummenproblems werden die folgenden Daten übergeben:
und . Alle Einträge von sowie auch sind dabei aus .

Gesucht wird die Teilmenge aus , sodass die Summe der Elemente aus ist (sofern es eine solche Summe gibt).

Beispiel

Gegeben ist das folgende Array:

Für gibt es eine Teilsumme und zwar:
Für gibt es keine Teilsumme
Für gibt es keine Lösungen, da die Summe aller Elemente von nur beträgt.

Naiver Algorithmus

Alle möglichen Teilsummen in ausprobieren. Da aus Elementen besteht und jedes Element entweder in der Teilsumme enthalten sein kann oder nicht gibt es mögliche Teilsummen.
Der naive Algorithmus ist also viel zu teuer.

Ansatz mit dynamischer Programmierung

Teilproblem

Es wird nun versucht das Teilproblem von zu lösen.
Dazu wird definiert. stellt sich genau die Frage: Ist Teilsumme von und gibt dementsprechend oder zurück.

Rekursion

Bei der Rekursion gibt es nun zwei Möglichkeiten. Die Teilsumme benutzt das Element oder die Teilsumme benutzt das Element nicht. Es entsteht also die folgende Rekursionsformel:

Der erste Teil () entspricht der Aussage, dass die Teilsumme das Elemente nicht verwendet.
Der zweite Teil () entspricht der Aussage, dass die Teilsumme das Element verwendet. Für den Fall, dass bei der Subraktion eine negative Zahl herauskommt kann zurückgegeben werden. Wenn das Element an der Stelle grösser als die gesuchte Teilsumme ist, so wird es von keiner Teilsumme verwendet werden.

Zudem müssen noch zwei Basisfälle definiert werden:

(für )

DP-Tabelle

Für den Fall und dem Array lässt sich die folgende DP-Tabelle aufstellen:

Die Lösung wird unten rechts in rot geschrieben. Eine bedeutet, dass es eine Teilsumme gibt. Um jetzt herauszufinden, was die einzelnen Summanden dafür sind kann man das Backtracking anwenden. Dazu gibt jeder Sprung nach links einen Summanden an.

Die Summanden sind also und

Laufzeitanalyse

Laufzeit:
Speicher:

Hier ist spannend zu beobachten, dass die Laufzeit von der Grösse der gesuchten Zahl abhängt. Dieses Verhalten nennt sich pseudo polynomielle Laufzeit.

Hier betrachtet man nun die Inputlänge. Dazu wird betrachtet, was die Anzahl der benötigten Bits für ist. Also der Logarithmus zur Basis von b: . Einfachheitshalber wird angenommen, dass jeder Eintrag des Arrays je eine Zelle des RAMs benötigen.

Das ergibt dann eine Inputlänge von .

Für ergibt das eine Inputlänge von aber eine Laufzeit von , was ein exponentielles Wachstum ist.

Für ergibt das eine Inputlänge von aber eine Laufzeit von , was ein polynomielles Wachstum ist.

Es stellt sich nun also die Frage, ob es eine Möglichkeit gibt das ganze zu verbessern und für alle eine polynomielle Laufzeit zu erreichen.

Die Antwort darauf ist: Man weiss es nicht aber es gibt eine starke Vermutung, dass es nicht besser geht (P und NP).