- Problem razbijemo na več enostavnejših, med seboj povezanih, podproblemov, običajno iste vrste.
- Podprobleme rešujemo ločeno in med njimi prenašamo rešitve.
Dinamično programiranje:
- reševanje problema od spodaj navzgor
- iz rešitev enostavnih podproblemov sestavljamo rešitev težjih problemov.
- Rešitve enostavnejših problemov shranjujemo in jih pri kasnejših klicih kompleksnejših problemov uporabimo.