OCaml (option informatique) · Chapitre 13 · Exercice de TD
Sac à dos 0/1
Programmation dynamique · niveau 2
Énoncé
Écrire sac objets capacite (objets indivisibles, tableau de couples (poids, valeur)).
Corrigé
let sac objets capacite =
let n = Array.length objets in
let dp = Array.make_matrix (n + 1) (capacite + 1) 0 in
for i = 1 to n do
let (po, va) = objets.(i - 1) in
for w = 0 to capacite do
dp.(i).(w) <- dp.(i - 1).(w);
if po <= w && dp.(i - 1).(w - po) + va > dp.(i).(w) then
dp.(i).(w) <- dp.(i - 1).(w - po) + va
done
done;
dp.(n).(capacite)
dp.(i).(w) est la meilleure valeur avec les i premiers objets sous capacité w : on choisit, pour l'objet i, le meilleur entre « sans » et « avec ». Coût . Le glouton par ratio (chapitre 12) ne donnait pas cet optimum.
Exercices semblables
- Montées d'escalier corrigé
- Chemin de coût minimal dans une grille corrigé
- Plus longue sous-suite commune corrigé
- Distance d'édition corrigé
- Reconstruire les pièces du rendu corrigé