Problema dello zaino
Input: zaino di capacità , oggetti , pesi , valore Output: selezionare degli oggetti con somma dei pesi totale minore o uguale a e che massimizzi il valore totale degli oggetti selezionati.
La soluzione ammissibile è: selezione degli oggetti tale che ogni e .

Esistono due varianti di questo problema:
- con ripetizione: lo stesso oggetto può essere selezionato più volte
- senza ripetizione: lo stesso oggetto può essere selezionato una sola volta
Il problema ha una sottostruttura ottima, e per questo si potrebbe utilizzare un algoritmo greedy.
Versione greedy
Ci possono essere vari modi per ordinare gli oggetti, per poi sceglierli iterativamente per inserirli nello zaino, ma non esiste un algoritmo greedy abbastanza buono da poter essere utilizzato, perché in qualche modo sbaglia sempre (vedere le slide per esempi concreti).
Versione programmazione dinamica
Come sottoproblema si può vedere: Per ogni tale che , definiamo massimo valore ottenibile con zaino di capacità .
Versione con ripetizione.
Il caso base è composto da massimo valore ottenibile con uno zaino di capacità 0. Soluzione al problema originale: massimo valore ottenibile con uno zaino di capacità W.
Per calcolare il valore della soluzione ottima si ha:
K[0] := 0
for w = 1 to W do
K[w] = max(i:wi <= w) {v1 + K(w-wi)}
Peso pseudo-polinomiale
Versione senza ripetizione
Il sottoproblema ha quindi una ridotta capacità dello zaino, e una ridotta scelta di items.
Per ogni tale che e per ogni definiamo massimo valore ottenibile con zaino di capacità potendo scegliere solo tra gli oggetti .
Se non sta nella soluzione ottima, allora si ha . Se invece sta nella soluzione ottima, allora si ha .
Se non sappiamo se è presente o meno nella soluzione, si ha
max_val_zaino(n, pesi, valori):
for j = 0 to n do
K[0, j] := 0
for w = 0 to W do
K[w, 0] := 0
for j = 1 to n do
for w = 1 to W do
if pesi[j] > w then
K[w, j] := K[w, j-1]
else
K[w, j] := max{K[w, j-1], valori[j] + K[w-pesi[j], j-1]}
return K[W, n]
Il costo computazionale è di