Le glouton et la dynamique ne rendent pas la même monnaie
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 17 — Programmation dynamique
Énoncé
Avec des pièces de , et , quel est le nombre minimal de pièces pour rendre ? Que rend l'algorithme glouton du chapitre chap:gloutons ? Écrire la récurrence dynamique.
Corrigé
Le glouton prend la plus grosse pièce possible tant qu'il peut : , soit trois pièces.
L'optimum est , soit deux pièces. Le glouton se trompe.
La récurrence est immédiate une fois le sous-problème posé. Soit le nombre minimal de pièces pour rendre exactement la somme :
avec si aucune pièce ne convient.
/* Nombre minimal de pieces pour rendre s, ou -1 si c'est impossible.
Preconditions : p[i] >= 1, k >= 1, s >= 0.
Complexite : Theta(k*s) en temps, Theta(s) en memoire. */
int rendu(const int p[], int k, int s) {
assert(k >= 1 && s >= 0);
int n[s + 1];
n[0] = 0;
/* INVARIANT : pour tout t < c, n[t] est le minimum cherche
(ou s+1, valeur sentinelle signifiant « impossible »). */
for (int c = 1; c <= s; c = c + 1) {
n[c] = s + 1; /* infini representable */
for (int i = 0; i < k; i = i + 1) {
if (p[i] <= c && n[c - p[i]] + 1 < n[c]) { n[c] = n[c - p[i]] + 1; }
}
}
return (n[s] > s) ? -1 : n[s];
}
Mesure sur le système , pour à :
s 0 1 2 3 4 5 6 7 8 9 10 11 12
N[s] 0 1 2 1 1 2 2 2 2 3 3 3 3
La ligne donne , la ligne donne là où le glouton en donne .
Le point de méthode. La sous-structure optimale tient ici : si une solution optimale pour utilise une pièce , ce qu'elle fait du reste est nécessairement optimal (sinon on améliorerait le tout). Le glouton, lui, suppose davantage : que le premier choix local est celui d'une solution optimale. C'est vrai pour le système euro, c'est faux pour . La dynamique n'a pas besoin de cette hypothèse, et c'est exactement ce qu'elle coûte plus cher : au lieu de .
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.