MAT210 A-2014 Un exemple de programmation dynamique 1
Geneviève Savard, SEG, ETS
Un exemple de programmation dynamique
Voici un document illustrant comment implémenter sur la TI Nspire une fonction
permettant d’obtenir le nombre minimal de pièces de monnaie totalisant un certain
montant. Par exemple, les différentes pièces pourraient être de 1 sou, 5 sous et 8 sous.
Nous avons vu que l’algorithme vorace ne donne pas le nombre minimal de pièces dans
ce cas. Par exemple, pour totaliser 50 sous, l’algorithme vorace commencerait par
prendre le plus de 8 sous possible, soit 6; il resterait alors 2 sous à totaliser avec 2 pièces
de 1 sou, pour un total de 8 pièces. Mais 50 = 5*8 + 2*5, on peut totaliser 50 sous avec 5
pièces de 8 sous et 2 pièces de 5 sous, pour un total de 7 pièces.
On peut utiliser définir directement la relation de récurrence et les conditions initiales.
Dans l’exemple précédent, avec des pièces de 1, 5 et 8 sous, on définit la fonction
suivante.
On pourra ensuite obtenir n’importe quel terme de la suite. Par exemple, pour connaître
le nombre minimal de pièces qui totalise 50 sous, on calcule nb(50).
Mais l’algorithme récursif ainsi créé est très lent, car pour calculer le nième terme, il
doit calculer trois termes précédents et pour chacun de ces termes il doit en calculer 3
autres. Les termes de la suite sont donc calculés plusieurs fois. L’algorithme présenté ici
est beaucoup plus efficace, car il calcule une seule fois chaque terme (en commençant par
le début de la suite) et le place en mémoire dans une liste. Il utilise ensuite cette
information pour calculer les termes suivants. C’est un exemple de programmation
dynamique
1
. La programmation dynamique est une méthode ascendante, contrairement
à diviser pour régner, une méthode descendante que nous verrons à la section 8.3.
1
Pour approfondir le sujet, voir Algorithmique, conception et analyse, G. Brassard et P. Bratley, Presses de
l’Université de Montréal., 1987. QA76.6.B728
MAT210 A-2014 Un exemple de programmation dynamique 2
Geneviève Savard, SEG, ETS
Voici l’algorithme utilisé.
Pour calculer le nombre de pièces pour un montant n, on crée un tableau de n + 1
éléments. On écrira dans chaque case i, le nombre minimal de pièces
nécessaires pour représenter le montant ( i - 1). Notez que dans l’implémentation
en C, la case i désignera le montant i. La case 0 correspondant au montant 0 et
la case n au montant n. Mais pour la TI, les cases vont de 1 à n + 1 alors on
ajuste l’algorithme.
Pour trouver ce nombre, on utilisera l'approche suivante :
tab[1] = 0 (il ne faut aucune pièce pour totaliser le montant 0)
POUR toutes les cases i suivantes 2...n+1
tab[i] = -1 (aucun minimum trouvé à présent pour le montant i -1 )
POUR toutes les dénominations d
SI (i 1 valeur de d ≥ 0) ALORS
SI tab[i] = -1 OU tab[i - valeur de d] + 1 <= tab[i] ALORS
tab[i] = tab[i - valeur de d] + 1
FINSI
FINSI
FIN POUR
FIN POUR
MAT210 A-2014 Un exemple de programmation dynamique 3
Geneviève Savard, SEG, ETS
Utiliser la fonction pour retrouver le nombre de chacune des pièces
Quel est le nombre minimal de pièces qu’il faut utiliser pour totaliser 18 sous? Et quelles
pièces faut-il utiliser? Toujours en travaillant uniquement avec des pièces de 1, 5 ou 8
sous. On voit ici que ce nombre est 3. Il faut au moins 3 pièces de monnaie pour
totaliser 18 sous.
Pour savoir quelles pièces utiliser pour obtenir 18 sous avec le moins de pièces possible,
on procède par soustraction tel que vu en classe. Pour éviter de recalculer la liste
inutilement, on la place en mémoire, ici sous le nom t.
Puisque l’élément (19-8) de la liste est 2, on déduit qu’il faut au minimum 2 pièces pour
totaliser (19-8-1=10) sous. Si on ajoute une pièce de 8 sous, il faudra ainsi 3 pièces pour
totaliser 18 sous, ce qui est minimal.
Puisque l’élément (19-8-8) de la liste est 2, on déduit qu’il faut 2 pièces pour totaliser 2
sous. Si on ajoute une pièce de 8 sous, il faudra ainsi 3 pièces pour totaliser 10 sous, ce
qui n’est pas minimal. Nous savons donc qu’il ne faut pas utiliser de 2e pièce de 8 sous.
Puisque l’élément (19-8-5) de la liste est 1, on déduit qu’il faut 1 pièce pour totaliser 5
sous. Si on ajoute une pièce de 5 sous, il faudra ainsi 2 pièces pour totaliser 10 sous, ce
qui est minimal. Nous savons donc qu’il faut utiliser ce 5 sous. On continue ainsi
jusqu’à l’élément (1) de la liste. On conclut finalement qu’une configuration optimale
consiste à utiliser une pièce de 8 sous et 2 de 5 sous pour totaliser 18 sous avec un
nombre minimal de pièces.
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !