OCaml (option informatique) · Chapitre 13 · Exercice de TD
Reconstruire les pièces du rendu
Programmation dynamique · niveau 3 (difficile)
Énoncé
Écrire pieces_du_rendu pieces montant : int list option qui renvoie la liste des pièces d'un rendu optimal (et pas seulement leur nombre).
Corrigé
let pieces_du_rendu pieces montant =
let infini = montant + 1 in
let m = Array.make (montant + 1) infini in
let choix = Array.make (montant + 1) (-1) in (* pièce choisie pour la somme s *)
m.(0) <- 0;
for s = 1 to montant do
List.iter (fun p ->
if p <= s && m.(s - p) + 1 < m.(s) then begin
m.(s) <- m.(s - p) + 1;
choix.(s) <- p
end
) pieces
done;
if m.(montant) = infini then None
else
let rec remonte s = if s = 0 then [] else choix.(s) :: remonte (s - choix.(s)) in
Some (remonte montant)
On mémorise, pour chaque somme s, la pièce choix.(s) qui a réalisé l'optimum. La reconstruction part de montant et soustrait à chaque étape la pièce choisie, jusqu'à 0. C'est le schéma général : une table annexe des choix permet de retracer la solution.
Exercices semblables
- Chemin de coût minimal dans une grille corrigé
- Plus longue sous-suite commune corrigé
- Sac à dos 0/1 corrigé
- Distance d'édition corrigé
- Reconstruire la sous-suite commune corrigé