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
. La programmation dynamique est une méthode ascendante, contrairement
à diviser pour régner, une méthode descendante que nous verrons à la section 8.3.
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