Adloun

Problème — Rendu de monnaie optimal avec reconstruction

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 5 — La récursivité

Énoncé

Problème — Rendu de monnaie optimal avec reconstruction.

On souhaite non seulement connaître le nombre minimal de pièces pour rendre une somme, mais aussi la liste des pièces utilisées. Écrire une fonction récursive rendu_liste(somme, pieces) renvoyant une liste de pièces de longueur minimale, ou None si le rendu est impossible.

Corrigé

On essaie chaque pièce inférieure ou égale à la somme, on résout récursivement pour la somme restante, et on conserve la solution la plus courte. Le cas de base est somme == 0, qui renvoie une liste vide.


def rendu_liste(somme, pieces):
    if somme == 0:
        return []
    meilleur = None
    for p in pieces:
        if p <= somme:
            reste = rendu_liste(somme - p, pieces)
            if reste is not None:
                candidat = reste + [p]
                if meilleur is None or len(candidat) < len(meilleur):
                    meilleur = candidat
    return meilleur

print(rendu_liste(11, [1, 2, 5]))   # affiche [1, 5, 5]
print(rendu_liste(7, [2, 4]))       # affiche None (impossible)

Cette version explore toutes les combinaisons : elle est correcte mais coûteuse. En pratique, on l'améliore par mémoïsation pour éviter de recalculer plusieurs fois le rendu d'une même somme.

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.