Programmer dynamiquement
Comment éviter de résoudre plusieurs fois le même problème ?
Environ 45 minutes
- Définir un état et une relation de récurrence.
- Construire une table et reconstruire une solution.
- Comparer approche gloutonne et optimisation dynamique.
Comment éviter de résoudre plusieurs fois le même problème ?
Pour rendre une somme avec le moins de pièces possible, choisir systématiquement la plus grosse pièce peut échouer. La programmation dynamique organise une recherche de la meilleure solution en conservant les réponses aux sous-problèmes. Nous utiliserons des valeurs entières positives et un stock illimité de chaque pièce. Tu dois déjà savoir écrire une boucle, manipuler un tableau et comprendre un appel récursif.
Reconnaître les sous-problèmes
Un sous-problème est une question de même nature que la question initiale, mais portant sur une entrée plus petite. Dans le rendu de monnaie, connaître le minimum de pièces pour la somme s aide à résoudre certaines sommes plus grandes. La programmation dynamique devient utile lorsque les mêmes sous-problèmes réapparaissent dans plusieurs branches de calcul. Les résoudre une fois, puis réutiliser leurs réponses, évite cette répétition.
Prenons des pièces de valeurs 1, 3 et 4. Pour rendre 6, une stratégie gloutonne choisit d’abord 4, puis 1, puis 1 : elle utilise trois pièces. Pourtant 3 + 3 utilise seulement deux pièces. Un choix local qui paraît favorable ne garantit donc pas une solution globalement optimale. Cet exemple ne dit pas que toute méthode gloutonne échoue toujours ; il montre qu’il faut justifier sa validité pour le système de pièces étudié.
Exemple résolu
Détermine le minimum de pièces pour rendre 6 avec les valeurs 1, 3 et 4.
- Étape 1 : Une seule pièce ne peut pas suffire, car aucune pièce ne vaut 6. Le minimum est donc au moins 2.
- Étape 2 : La combinaison 3 + 3 réalise exactement 6 avec deux pièces. Elle atteint cette borne inférieure.
- Étape 3 : La combinaison 4 + 1 + 1 fonctionne aussi, mais utilise trois pièces et n’est donc pas optimale.
Résultat : Le minimum vaut 2, atteint par deux pièces de valeur 3.
Piège à éviter : Confondre une solution possible avec une solution optimale laisse passer la réponse gloutonne à trois pièces.
Deux propriétés guident la méthode. D’abord, les solutions recherchées se décrivent à partir de solutions de sous-problèmes. Ensuite, les sous-problèmes se recouvrent : la même somme restante peut apparaître après différents choix. La première propriété permet d’écrire une relation de récurrence ; la seconde explique l’intérêt de mémoriser. Une récursion qui recalcule sans cesse les mêmes valeurs ne tire pas encore parti de cette mémorisation.
Définir un état et une relation
Notons M(s) le nombre minimal de pièces nécessaires pour rendre exactement la somme s. Pour s = 0, aucune pièce n’est nécessaire : M(0) = 0. Pour une somme positive, on envisage chaque valeur c disponible telle que c ≤ s. Si c est la dernière pièce choisie, il reste s − c à rendre. Le nombre de pièces correspondant est donc 1 + M(s − c). On choisit le minimum de ces candidats.
La relation s’écrit M(s) = 1 + min des M(s − c), pour les pièces c qui ne dépassent pas s et dont le reste est réalisable. Le terme 1 compte la pièce ajoutée. Avec une pièce de valeur 1, toutes les sommes entières positives sont réalisables. Sans cette pièce, certaines sommes peuvent être impossibles ; il faut alors utiliser une valeur spéciale représentant l’impossibilité, et non la confondre avec zéro.
Pourquoi peut-on utiliser une solution optimale du reste ? Si une solution minimale pour s terminée par c contenait une façon non optimale de rendre s − c, on pourrait remplacer cette partie par une meilleure et diminuer le nombre total de pièces. Cela contredirait la minimalité supposée. Ce raisonnement justifie la relation ; recopier une formule sans expliquer le rôle de l’état ne suffit pas.
Construire une table de bas en haut
- Créer un tableau M de longueur S + 1 pour une somme cible S. Initialiser M[0] à 0 et les autres cases à une valeur représentant l’impossibilité.
- Pour chaque somme s allant de 1 à S, examiner toutes les pièces c telles que c ≤ s. Si le reste s − c est réalisable, calculer 1 + M[s − c].
- Conserver le plus petit candidat dans M[s]. Mémoriser aussi une pièce qui atteint ce minimum si l’on souhaite reconstruire une solution.
- Lire M[S]. Si la case reste impossible, annoncer qu’aucune combinaison de pièces ne réalise la somme demandée.
À toi d'essayer
Avec des pièces de valeurs 2 et 5, quelles sommes parmi 0, 1, 2 et 3 sont réalisables ? Comment représenter les autres dans une table de minimums ?
Voir la réponseMasquer la réponse
Zéro est réalisable avec zéro pièce et 2 avec une pièce. Les sommes 1 et 3 sont impossibles. Leurs cases doivent porter une valeur spéciale, par exemple l’infini, distincte de zéro.
Calculer et reconstruire une solution
Exemple résolu
Complète la table jusqu’à 6 avec les pièces 1, 3 et 4.
- Étape 1 : M(0) = 0, puis M(1) = 1 et M(2) = 2, car seule la pièce 1 convient aux deux premières sommes positives.
- Étape 2 : M(3) = 1 grâce à la pièce 3. M(4) = 1 grâce à la pièce 4.
- Étape 3 : Pour 5, les candidats valent 1 + M(4) = 2, 1 + M(2) = 3 et 1 + M(1) = 2 : M(5) = 2.
- Étape 4 : Pour 6, les candidats valent 1 + M(5) = 3, 1 + M(3) = 2 et 1 + M(2) = 3 : M(6) = 2.
Résultat : La table est [0, 1, 2, 1, 1, 2, 2]. La meilleure dernière pièce pour 6 vaut 3.
Piège à éviter : Pour calculer M(6), comparer les valeurs des pièces elles-mêmes ne suffit pas : il faut comparer les nombres de pièces des solutions restantes.
La table des minimums indique une quantité, mais pas directement la combinaison choisie. Un second tableau, dernier, peut mémoriser une pièce atteignant le minimum de chaque somme. Pour reconstruire, partir de S, lire dernier[S], soustraire cette pièce, puis recommencer jusqu’à zéro. La somme diminue strictement puisque toutes les pièces sont positives ; la reconstruction termine donc si la somme initiale est réalisable.
Exemple résolu
Reconstruis une solution pour 6 à partir des choix dernier[6] = 3 et dernier[3] = 3.
- Étape 1 : La somme restante vaut 6. Lire la pièce 3, l’ajouter à la solution et passer à la somme restante 3.
- Étape 2 : Lire à nouveau la pièce 3 pour cette somme restante. La nouvelle somme restante vaut zéro.
- Étape 3 : Arrêter la reconstruction. Vérifier la somme des pièces et leur nombre par rapport à M(6).
Résultat : La solution contient [3, 3] : sa somme vaut 6 et sa longueur vaut 2, égale au minimum mémorisé.
Piège à éviter : Suivre les indices sans soustraire la pièce choisie empêcherait la somme restante de diminuer.
À toi d'essayer
Avec les mêmes pièces 1, 3 et 4, détermine une solution optimale pour 8 en utilisant la table jusqu’à 6 et un raisonnement sur le nombre minimal possible.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
Mémorisation, ordre de calcul et coût
On peut également partir d’une fonction récursive qui calcule M(s) en demandant les valeurs des restes. Avant tout nouveau calcul, elle consulte un dictionnaire de résultats déjà connus. Si la valeur existe, elle la renvoie ; sinon, elle la calcule puis l’enregistre. Cette méthode descendante est appelée mémoïsation. Le remplissage progressif du tableau est une méthode ascendante. Les deux approches utilisent la même relation, mais n’organisent pas le travail de la même façon.
Avec k valeurs de pièces et une cible S, un remplissage ascendant examine au plus k possibilités pour chacune des S sommes positives. Son coût est O(kS), en comptant les opérations arithmétiques et les accès usuels comme élémentaires. Les tableaux occupent O(S) cases. Cette borne dépend de la valeur numérique de S : doubler une somme très grande peut coûter cher même si son écriture n’ajoute qu’un chiffre.
L’ordre du calcul compte. La case M(s) dépend de sommes strictement inférieures à s, donc elles doivent déjà être connues. Remplir le tableau dans l’ordre décroissant échouerait avec cette relation. De même, une pièce nulle ferait dépendre M(s) de lui-même et une pièce négative pourrait renvoyer vers une somme supérieure. Le contrat impose des pièces strictement positives ; ce n’est pas un détail de présentation.
À toi d'essayer
On limite désormais chaque pièce physique à une seule utilisation. Peut-on conserver sans changement l’état M(s) et la relation précédente ? Donne un contre-exemple.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
Au bac : concevoir et vérifier
Au bac : expliquer une programmation dynamique
- Définir précisément ce que signifie chaque case avant d’écrire une boucle. Donner le domaine des indices et le cas de base.
- Justifier la relation en décrivant le dernier choix possible et la solution optimale du reste.
- Choisir un ordre compatible avec les dépendances. Montrer à la main quelques cases, dont un cas impossible s’il peut exister.
- Distinguer le résultat optimal de la solution qui l’atteint. Annoncer séparément le coût en calcul et la mémoire.
Pour tester une implémentation, vérifier la somme zéro, une somme égale à une pièce, une somme impossible et un cas où le glouton échoue. Pour une combinaison renvoyée, contrôler que chaque valeur est autorisée, que la somme est exacte et que le nombre de pièces correspond au minimum. Sur de petites sommes, une exploration exhaustive indépendante permet de comparer les résultats et de révéler une erreur de récurrence ou d’initialisation.
Erreurs fréquentes : initialiser toutes les cases à zéro ; oublier le coût de la dernière pièce ; confondre indice et valeur de pièce ; modifier silencieusement le stock disponible ; affirmer qu’une bonne réponse sur un seul exemple prouve l’optimalité générale.
Vocabulaire
- État :
- Information minimale qui définit un sous-problème.
- Récurrence :
- Relation exprimant une réponse à partir de réponses plus petites.
- Mémoïsation :
- Conservation des résultats d’appels récursifs afin de les réutiliser.
- Solution optimale :
- Solution réalisable qui minimise ou maximise le critère choisi.
Bilan
| Repère | Sens |
|---|---|
| État | Somme restante, avec stock illimité fixé. |
| Transition | Ajouter une pièce à une solution du reste. |
| Mémoire | Table des minimums, éventuellement table des choix. |
S’entraîner
Pour poursuivre ton entraînement, ouvre la rubrique S’entraîner du site, à l’adresse /exercices. Reprends d’abord les questions de cette leçon sans afficher les réponses, puis compare ton raisonnement à la correction.
À retenir
- La programmation dynamique mémorise des résultats de sous-problèmes réutilisés.
- Pour le rendu étudié, les pièces sont positives et leur stock est illimité.
- Une solution réalisable n’est pas nécessairement optimale.
- Le minimum pour une somme nulle est zéro pièce.
Fiche de révision
Avant de programmer, écrire une phrase qui définit M(s). Le sens de la case commande la relation, son initialisation et l’ordre de parcours.
Pour les pièces 1, 3, 4, la cible 6 illustre l’échec du choix glouton : 4 + 1 + 1 utilise une pièce de plus que 3 + 3.
Pour retrouver les pièces, mémoriser une décision avec chaque minimum puis soustraire les choix successifs.
Changer le stock ou autoriser d’autres valeurs peut imposer un autre état ; la relation n’est valable que sous ses hypothèses.
Et maintenant ?
Tu as lu le cours. L’étape suivante tient en une action.
Relis le coursReprends l’essentiel avant de passer à la suite.Prolonge l’expérience !
Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !
Ici, tu débloques aussi 2 corrections détaillées.
Parent ? Suivez les progrès de votre enfant.
