Rendre la monnaie 1 Présentation du probl`eme 2 Un cas simple
Transcription
Rendre la monnaie 1 Présentation du probl`eme 2 Un cas simple
Rendre la monnaie 1 Présentation du problème On dispose de pièces en nombre illimité de valeurs entières deux à deux distinctes et non nulles v0 , v1 , . . . , vn−1 (∀i, vi ∈ N∗ et ∀i 6= j, vi 6= vj ). On a une somme S ≥ 0 à rendre et on veut savoir si c’est possible et, dans ce cas, obtenir une solution qui minimise le nombre des pièces utilisées. Pn−1 n tel que Il s’agit donc de chercher s’il existe un n-uplet (k , . . . , k ) ∈ N 0 n−1 i=0 ki vi = S et, dans ce P cas, de trouver une solution qui minimise n−1 k . i i=0 Dans toute la suite, les valeurs vi seront supposées stockées dans un tableau v d’entiers naturels non nuls et deux à deux distincts et on a donc v.(i) = vi . Une solution, si elle existe, sera aussi représentée par un tableau d’entiers naturels. 1. Ecrire une fonction élémentaire verifie : int vect → bool telle que l’appel verifie v renvoie un booléen indiquant si l’argument v vérifie les contraintes imposées ci-dessus. 2. Calculer la complexité de votre fonction dans le cas le pire. 3. Sans implémenter, proposer des pistes pour améliorer la fonction en précisant quelle complexité on peut espérer atteindre. 2 Un cas simple On suppose dans cette partie que la donnée v vérifie les hypothèses précédentes plus les deux suivantes : - les vi sont ordonnés de manière croissante (0 < v0 < v1 < · · · < vn−1 ) ; - on a v0 = 1. 4. Justifier qu’il existe bien une solution minimale au sens indiqué plus haut. Pour S ≥ 0 et i ∈ [|0, n − 1|], on peut alors noter z(S, i) le nombre minimal de pièces permettant de rendre la monnaie sur S avec des pièces de valeurs v0 , . . . , vi . 5. (a) Montrer que dans le cas général on a z(S, i) = min(z(S, i − 1), 1 + z(S − vi , i)) (b) Préciser les cas particulier et prouver que toutes ces relations (cas général et cas particuliers) définissent effectivement z sur N × [|0, n − 1|]. 6. On veut écrire une fonction prenant en argument le tableau v de valeurs des pièces ainsi que la somme S à décomposer et renvoyant le nombre minimal de pièces à utiliser. Dans cette approche dynamique, l’idée est d’utiliser localement une matrice z de bonne taille où l’on stocke les valeurs déjà connues. (a) Quelle doit être la taille de la matrice z ? (b) On suppose n = 3 et v0 = 1, v1 = 2, v2 = 5. Pour S = 9, construire à la main cette table z en expliquant l’ordre de construction. (c) Ecrire la version itérative par mémorisation de la fonction voulue. (d) Ecrire la version par mémoı̈sation qui utilise une fonction récursive locale dont on précisera le type. (e) Quelle est la complexité de la fonction ? Expliquer pourquoi, avec les hypothèses faites, on préfère la première version. 1 Il n’est pas difficile de modifier la fonction précédente pour qu’elle renvoie la matrice z. On veut maintenant écrire une fonction prenant en argument cette matrice z ainsi que v et renvoyant une solution minimale sous la forme d’un tableau d’entiers. L’idée est de gérer un tableau initialement composé de 0 (on a choisi 0 pièce de chaque valeur) et d’incrémenter la valeur de la case numéro i quand on “choisit” de rendre une pièce de valeur vi . 7. Dans la formule de 5.a, quel est le cas où l’on choisit de “rendre une pièce” ? Et dans les cas particuliers ? 8. Reprendre l’exemple de 6.b pour expliquer comment on construit algorithmiquement une solution. 9. Ecrire la fonction solution : int vect vect → int vect → int vect voulue. 3 Généralisation On revient au cas général et on ne suppose plus que v0 = 1 ni que les vi sont ordonnés (il sont cependant toujours > 0 et deux à deux distincts). 10. Montrer qu’il peut ne pas exister de solution minimale. On ne peut donc a priori plus utiliser la notation z(S, i). 11. Montrer qu’en donnant une bonne valeur (à préciser) à z(S, i) quand il n’existe pas de solution, la formule générale de la question 5 est encore utilisable. On précisera bien sûr à nouveau les valeurs dans les cas “particuliers”. 12. Ecrire une fonction prenant en argument le tableau v de valeurs des pièces ainsi que la somme S à décomposer et renvoyant le nombre minimal de pièces à utiliser. On choisira la technique de mémorisation OU de mémoı̈sation en expliquant le choix effectué. On précisera l’action de la fonction quand il n’existe pas de solution. 2