Algorithme de rendu de monnaie en programmation dynamique
Objectif⚓︎
On cherche à rendre une somme donnée en utilisant le moins de pièces possible parmi un ensemble donné de valeurs de pièces. Cet algorithme permet de calculer non seulement le nombre minimal de pièces mais aussi quelles pièces choisir.
L'approche utilisée ici est celle de la programmation dynamique dite bottom-up, qui construit une table pour trouver les solutions optimales à tous les sous-problèmes jusqu'à la somme cible.
1. Construction de la table de programmation dynamique (bottom-up)⚓︎
Compléter le code suivant pour remplir la table least_coins qui donne le nombre minimal de pièces pour chaque sous-montant :
Objectif : remplir la table en minimisant le nombre de pièces utilisées pour chaque montant.
2. Reconstruction de la solution optimale⚓︎
Une fois la table remplie, on peut reconstruire la combinaison de pièces choisies. Compléter le code ci-dessous pour cela :
Objectif : en partant de least_coins[n-1][amount], déterminer quelles pièces permettent d'obtenir ce résultat optimal.
Le code suivant sera ajouté à la fin de la fonction least_coins, à la place du return least_coins[n - 1][amount], et en ajoutant return chosen
| Python | |
|---|---|
3. Variante top-down (récursive avec mémoïzation)⚓︎
Compléter le code suivant qui propose une version récursive mémoïisée (top-down) de l'algorithme :
Cette version met en œuvre l'approche descendante qui consiste à partir du problème global et résoudre récursivement les sous-problèmes nécessaires.
Ici la focntion récursive (top_down) ne donne que le nombre de pièces minimal. Pas la répartition.
Conclusion⚓︎
L'approche en programmation dynamique permet d'éviter la répétition de calculs inutiles et garantit une solution optimale.
Les deux versions (bottom-up et top-down) permettent d'appréhender deux façons complémentaires de raisonner sur des problèmes d'optimisation discrète.
Crédits : Rendu de monnaie, bases de programmation dynamique -Dec 11, 2016 • Jill-Jênn Vie & Clémence Réda