Adloun

Rendu optimal exhaustif

Exercice · OCaml (option informatique), chapitre 12 — Algorithmes gloutons

Énoncé

Écrire rendu_min pieces montant qui calcule le nombre minimal de pièces (système quelconque, pièces illimitées), par exploration récursive.

Corrigé

let rec rendu_min pieces montant =
  if montant = 0 then 0
  else begin
    let infini = montant + 1 in     (* borne : jamais plus de 'montant' pièces (pièce 1) *)
    let meilleur = ref infini in
    let rec essaie l =
      match l with
      | [] -> ()
      | p :: reste ->
          if p <= montant then begin
            let r = rendu_min pieces (montant - p) in
            if 1 + r < !meilleur then meilleur := 1 + r
          end;
          essaie reste
    in
    essaie pieces;
    !meilleur
  end

On essaie chaque pièce comme premier choix, et l'on garde le meilleur sous-rendu : c'est l'optimum, mais au prix d'une explosion (le même montant est recalculé maintes fois — la mémoïsation du chapitre 8, ou la programmation dynamique du chapitre suivant, y remédient).

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.