Sac à dos 0/1
Exercice · OCaml (option informatique), chapitre 13 — Programmation dynamique
É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.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.