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