Exercice : Rendu de monnaie
Un commerçant doit rendre de la monnaie à l'un de ses clients en minimisant le nombre de pièces et de billets possibles. On admettra par la suite que le commerçant dispose toujours de la réserve nécessaire dans chaque espèce monétaire.

Question
En prenant pour exemple la monnaie européenne et en oubliant les centimes, si le commerçant doit rendre 9 euros, donner toutes les combinaisons possibles de pièces et de billets. Extraire celle qui minimise le nombre de pièces et de billets.
Solution
Le commerçant a 8 combinaisons qui utilisent entre 3 et 9 espèces. La combinaison permettant de minimiser est celle bien entendu d'utiliser deux pièces de 2€ et un billet de 5€.

Question
En prenant pour exemple la monnaie européenne et en oubliant les centimes, déterminer la stratégie pour rendre la monnaie sur un montant inférieur à 50 € de tel sorte que le nombres de pièces et de billets soit minimal.
Indice
On peut commencer par le billet ou la pièce qui a la plus grande valeur...
Solution
La stratégie gloutonne pour résoudre ce problème va consister à prendre la monnaie la plus grande (autant de fois que nécessaire) et de la retirer de la somme à rendre. Il faudra répéter cette opération jusqu'à ce la somme à rendre soit nulle.
En reprenant l'exemple précédent, admettons que le commerçant adopte cette méthode, il procédera alors ainsi :
• Il tente de donner 10€, ce n'est pas possible car trop grand
• Il donne 5€, il reste donc 4€ à rendre au client
• Il tente de donner 5€, ce n'est pas possible car trop grand
• Il donne 2€, il reste donc 2€ à rendre au client
• Il donne 2€, il ne reste plus rien à rendre au client
Question
Écrire un programme qui implémente cet algorithme. On utilisera la monnaie européenne avec des espèces allant de 20€ à 1€.
Pour une somme à rendre, le programme affichera par exemple les messages suivants :

Indice
Vous avez une liste d'entiers reprenant les différentes valeurs des espèces que l'on appellera espece et qui sera définie ainsi :
espece=[20,10,5,2,1]
Solution
def rendu_monnaie(montant, espece):
rendu = {}
for coin in espece:
if montant // coin != 0:
rendu[coin] = montant // coin
montant = montant % coin
return rendu
Question
Que donne votre programme avec le système de pièces (4, 3, 1 )
Solution
Dans le système de pièces (1, 3, 4), l'algorithme glouton n'est pas optimal, comme le montre l'exemple simple :
le programme donne 6 = 4+1+1, alors que 3+3 est optimal.