Exercices sur la programmation dynamique¶
Exercice 1 - Rendu de monnaie simple (extrait du Hachette Terminale)
- En appliquant l’algorithme glouton, écrire la fonction
monnaie_glouton(valeurs, montant)qui renvoie la liste la plus courte possible des « pièces » à rendre pour obtenir le montant demandé, sachant qu’on ne peut rendre que des pièces dont les valeurs sont inclues dans la listevaleurs.
Trouver trois exemples de montants qui peuvent être rendus avec les valeurs[5, 14, 23], mais pour lesquelsmonnaie_gloutonne trouve pas de solution. - Compléter la fonction
monnaie_systematiqueci-dessous qui parcourt systématiquement l’arbre des rendus possibles jusqu’à ce que le montant restant à rendre soit nul ou que tous les nœuds d’un niveau de l’arbre soient négatifs :
def monnaie_systematique(valeurs, montant): # L'arbre : un dictionnaire par niveau, dont # les clés sont les valeurs ayant menées à la # somme restant à rendre. mem = [ {(): montant} ] # À chaque niveau de l'arbre on calcule # l'effet des valeurs possibles à partir # des nœuds supérieurs. while len(mem[-1]) > 0: mem.append( {} ) for chemin, restant in mem[-2].items(): ... - Cette approche trouve-t-elle toujours une solution, si elle existe ?
- Le remplissage et l’usage de
memconstitue-t-il un exemple de mémoïsation ? - Cette approche est-elle un exemple de programmation dynamique ? Pourquoi ?
Exercice 2 - Rendu de monnaie dynamique (extrait du Hachette Terminale)
- À partir de la fonction
monnaie_systematiquede l’exercice 1 , écrire la fonctionmonnaie_dynamique(valeurs, montant)qui effectue le même parcours, mais qui évite d’évaluer les combinaisons redondantes de valeurs, par exemple[5, 14, 23]et[14, 5, 23].
Pour ce faire, les clés des éléments dememdoivent être des listes de nombres de pièces pour chaque valeur devaleurs, par exemple [1, 0, 2] correspond à une pièce de 5 et deux pièces de 23. De cette manière, les séquences de valeurs comme[5, 14, 23]et[14, 5, 23]sont représentées de la même façon (ici[1, 1, 1]), et on peut économiser des calculs redondants. - Cette approche est-elle montante ou descendante ?
- Écrire une seconde version de
monnaie_dynamiquequi utilise l’autre approche.