Für jedes Item wird rekursiv in den binären Baum abgestiegen.
Nach dem Prüfen auf Abbruchkonditionen und die beste Kombination
wird zuerst mit Bit 1 "nach links" und darauf mit Bit 0 "nach rechts" abgestiegen bzw. traversiert.
Die `traverse()` Funktion hat viele Parameter, benötigt so aber keine globalen Variablen.
Um Variablen per Referenz zu übergeben werden diese in Objekte (hier Listen) "verpackt".
Eine einfache Möglichkeit zur Optimierung wäre, einen Zweig vorzeitig zu verlassen, sobald das Maximalgewicht überschritten wird.
## Dynamische Programmierung
Die dynamische Programmierung nutzt eine Tabelle um erheblich schneller zu gleichfalls esten Lösung zu kommen.
Für jedes Item wird eine Zeile und für jedes Gewichsinkrement eine Spalte angelegt.
Nacheinander wird jedes Item erst einer Hilfszeile hinzugefügt.
Diese wird dafür um den Gewichtswert verschoben.
Anschließend wird verglichen, ob die Kombination der Hilfszeile einen größeren Wert hat als die letzte Kombination jeder Spalte, der bessere Wert wird überniommen.
Ist unten rechts der beste Wert gefunden, so wird die Tabele rückwärts betrachtet.
Das erste Auftreten eines Wertes in der Spalte zeigt das Hinzufügen eines Items an.
Dieses wird gespeichert, die Spalte um den Abzug des Gewichts nach links gewechselt und eine weitere Zeile aufgestiegen.
Dies wird so lange wiederholt bis ein Feld mit leerem Rucksack bzw. Wert 0 vorgefunden wird.
Liegen mehrere gleiche Werte nebeneinander kann auf gleich gute Kombinationen geschlossen werden.