☀️ Stage Pré-rentrée · dès le 24 aoûtRéserver ma place →
Majorant
📘 Fiche de cours · 1re année📐 MPSI💻 Informatique Informatique communeNiveau · Sup

Algorithmes gloutons

Le paradigme glouton et sa limite : le rendu de monnaie euro tracé pas à pas, le contre-exemple [1,3,4] pour 6 (glouton 3 pièces contre optimum 2) qui prouve qu'un glouton n'est pas toujours optimal, et la sélection d'activités où il l'est — avec trois exercices corrigés.

Fiche rédigée par les mentors Majorant — alumni Polytechnique, CentraleSupélec et Mines Paris.

1 définitions1 théorèmesMis à jour le 2026-08-02

Vue d'ensemble

Imagine que tu doives rendre la monnaie à un client, ou choisir le plus d'activités possible dans une journée. À chaque étape, une stratégie tentante consiste à prendre ce qui paraît le meilleur ici et maintenant, sans se soucier de la suite, et sans jamais revenir sur une décision. C'est exactement l'idée d'un algorithme glouton (en anglais greedy, « gourmand »). Cette fiche te montre pourquoi cette idée est à la fois puissante, rapide… et parfois trompeuse.

Au programme (BO 2021, informatique commune de première année) : les algorithmes gloutons figurent parmi les paradigmes de conception d'algorithmes. L'objectif est de comprendre le principe glouton, de savoir l'appliquer sur des exemples simples (rendu de monnaie, sélection d'activités) et surtout de savoir qu'un glouton ne fournit pas toujours la solution optimale. Aucune démonstration d'optimalité n'est exigible : le point capital est le contre-exemple.

Prérequis

  • Boucles for et while, tests if.
  • Manipulation de listes Python (parcours, append, tri).
  • Notion de tri d'une liste (souvent on trie avant de dérouler le glouton).
  • Complexité temporelle : savoir dire qu'un algorithme est en , , etc.
🎯 Accompagnement Majorant

Le glouton, un piège d'oral. « Votre algorithme donne-t-il toujours l'optimum ? » est LA question qui déstabilise en colle. Nos mentors alumni X · Centrale · Mines t'entraînent à démasquer un glouton non optimal en trente secondes, contre-exemple à l'appui.

Trouver un mentor →

1. Le principe glouton

Définition 1.1 — Algorithme glouton

Un algorithme glouton construit une solution par étapes. À chaque étape, il fait le choix qui semble le meilleur localement (le plus « gourmand ») selon un critère fixé, puis il passe à l'étape suivante sans jamais remettre en cause les choix déjà faits.

Trois mots résument tout : étapes (on avance morceau par morceau), local (on regarde seulement ce qui est le mieux à cet instant, jamais l'avenir), irrévocable (aucun retour en arrière). Ce dernier point est ce qui rend un glouton rapide… et ce qui l'empêche parfois d'atteindre l'optimum.

📝 Glouton ≠ force brute. Une approche par force brute essaierait toutes les combinaisons pour garder la meilleure : c'est lent mais exact. Le glouton n'en essaie qu'une seule, guidée par son critère local : c'est rapide, mais l'exactitude n'est pas garantie.
📐 Méthode — Écrire un glouton
  1. Identifier les « objets » parmi lesquels choisir (des pièces, des activités…).
  2. Choisir un critère de gourmandise : quel objet paraît le meilleur à chaque étape ? (souvent après un tri).
  3. Parcourir les objets dans cet ordre, ajouter un objet à la solution s'il est « compatible » avec ce qui a déjà été choisi.
  4. Ne jamais revenir en arrière.
  5. Se méfier : vérifier sur des exemples, et surtout chercher un contre-exemple avant d'affirmer que le glouton est optimal.

2. Exemple central — le rendu de monnaie

Le problème : rendre une somme donnée avec le moins de pièces possible, à partir d'un système de pièces disponibles en quantité illimitée. Avec le système euro , le glouton naturel est : à chaque étape, prendre la plus grande pièce inférieure ou égale à ce qui reste à rendre.

def rendu_glouton(systeme, somme):
    systeme = sorted(systeme, reverse=True)   # pieces de la plus grande a la plus petite
    pieces = []
    for piece in systeme:
        while somme >= piece:
            somme -= piece
            pieces.append(piece)
    return pieces

euro = [1, 2, 5, 10, 20, 50, 100, 200]
print(rendu_glouton(euro, 68))   # [50, 10, 5, 2, 1]
🔍 Décryptage ligne par ligne
def rendu_glouton(systeme, somme):On définit la fonction : systeme est la liste des valeurs de pièces disponibles, somme est le montant (en unités, ici en euros entiers) qu'il faut rendre.
systeme = sorted(systeme, reverse=True)On trie les pièces de la plus grande à la plus petite. C'est le cœur du critère glouton : on veut essayer d'abord les grosses pièces. reverse=True inverse l'ordre croissant habituel.
pieces = []Liste (vide au départ) qui va accumuler les pièces effectivement rendues.
for piece in systeme:On parcourt les valeurs de pièces, de la plus grande à la plus petite.
while somme >= piece:Tant que la pièce courante « tient » dans ce qui reste à rendre, on la reprend encore une fois. Le while permet d'utiliser plusieurs fois la même valeur (par exemple deux pièces de 1).
somme -= pieceOn retire la valeur de la pièce du montant restant : on vient de « rendre » cette pièce.
pieces.append(piece)On enregistre la pièce rendue dans la solution.
return piecesUne fois toutes les pièces passées, le montant restant vaut 0 (car la pièce 1 finit toujours le travail) et on renvoie la liste des pièces choisies.

Déroulons sur un exemple concret : rendre 68. La plus grande pièce est 50 → reste 18. La plus grande pièce est 10 → reste 8. Puis 5 → reste 3, puis 2 → reste 1, puis 1 → reste 0. Total : 5 pièces.

Trace de rendu_glouton(euro, 68) — à chaque étape on prend la plus grande pièce possible
ÉtapeReste à rendrePlus grande pièce restePièces rendues
départ6850[50]
21810[50, 10]
385[50, 10, 5]
432[50, 10, 5, 2]
511[50, 10, 5, 2, 1]
fin0 ✓5 pièces ✓
📝 Pourquoi ça marche pour l'euro. Avec le système euro, le glouton donne toujours le nombre minimal de pièces. On dit que ce système est canonique. C'est une propriété du système de pièces, pas du glouton lui-même : change les valeurs et la garantie peut disparaître (section suivante).
⚠ Attention à la complexité annoncée. On lit parfois « le glouton est linéaire ». Ici la boucle while retire une pièce à la fois : si tu ne disposes que de la pièce 1 pour rendre , tu fais tours. Le nombre de tours dépend donc du montant, pas seulement du nombre de types de pièces. Le tri initial, lui, coûte est le nombre de types de pièces.

3. Le piège capital — le glouton n'est pas toujours optimal

Voici le point le plus important de toute la fiche. Prends un système de pièces différent : . On veut rendre 6. Que fait le glouton ?

systeme = [1, 3, 4]
print(rendu_glouton(systeme, 6))   # [4, 1, 1]  ->  3 pieces
🔍 Décryptage ligne par ligne
systeme = [1, 3, 4]Un système de pièces inventé : on ne dispose que des valeurs 1, 3 et 4.
print(rendu_glouton(systeme, 6))On applique EXACTEMENT le même glouton que pour l'euro. Il trie en [4, 3, 1], prend d'abord 4 (reste 2) ; 4 et 3 ne tiennent plus dans 2, donc il prend 1 puis 1 (reste 0). Résultat : [4, 1, 1], soit 3 pièces.
Le glouton sur [1,3,4] pour rendre 6 : il « gaspille » en prenant la grosse pièce d'abord
ÉtapeRestePlus grande pièce restePièces rendues
départ64[4]
221 (4 et 3 trop grands)[4, 1]
311[4, 1, 1]
fin0 ✓3 pièces

Mais existe-t-il mieux ? Oui ! : deux pièces de 3 suffisent. L'optimum est donc 2 pièces, alors que le glouton en a rendu 3. Le glouton s'est trompé en prenant la pièce 4 tout de suite.

# Verification de l'optimum par programmation dynamique
def rendu_optimal(systeme, somme):
    INF = float('inf')
    dp = [0] + [INF] * somme
    for s in range(1, somme + 1):
        for p in systeme:
            if p <= s and dp[s - p] + 1 < dp[s]:
                dp[s] = dp[s - p] + 1
    return dp[somme]

print(rendu_optimal([1, 3, 4], 6))   # 2
🔍 Décryptage ligne par ligne
dp = [0] + [INF] * sommeTableau : dp[s] = nombre minimal de pièces pour rendre exactement s. On sait rendre 0 avec 0 pièce ; toutes les autres cases valent « l'infini » tant qu'on ne les a pas améliorées.
for s in range(1, somme + 1):On calcule l'optimum pour chaque montant de 1 jusqu'à la somme visée.
for p in systeme:Pour rendre s, on essaie toutes les pièces possibles comme « dernière pièce rendue » — c'est justement ce que le glouton ne fait pas.
if p <= s and dp[s - p] + 1 < dp[s]:Si la pièce p tient dans s, alors rendre s coûte au mieux « rendre s-p » plus cette pièce. On garde le minimum.
return dp[somme]La case finale contient le vrai minimum : 2 pour et 6. Le glouton, lui, en donnait 3.
Propriété 3.1 — Le glouton du rendu de monnaie n'est optimal que pour certains systèmes

Pour le système euro, le rendu glouton donne toujours le nombre minimal de pièces (système dit canonique). Mais il existe des systèmes, comme , pour lesquels le glouton est strictement pire que l'optimum : rendre 6 coûte 3 pièces au glouton contre 2 à l'optimum. La garantie d'optimalité dépend donc du système de pièces.

⚠ Ne jamais présumer l'optimalité. « Prendre le plus gros d'abord » semble évident, mais l'évidence n'est pas une preuve. Un unique contre-exemple suffit à démolir l'affirmation « ce glouton est optimal ». Réflexe d'oral : dès qu'on te demande si un glouton est optimal, cherche un contre-exemple avant de répondre oui.
🎯 Accompagnement Majorant

Trouver le contre-exemple, ça se travaille. Sur , le déclic vient de . Nos mentors alumni X · Centrale · Mines te donnent la méthode pour construire un contre-exemple à la demande, sur n'importe quel énoncé de glouton.

Trouver un mentor →

4. Deuxième exemple — la sélection d'activités (glouton optimal)

Un problème où, cette fois, le glouton est optimal. On dispose d'activités, chacune avec une heure de début et une heure de fin. On ne peut faire qu'une activité à la fois. Objectif : en réaliser le plus grand nombre possible sans chevauchement. Le bon critère glouton (souvent contre-intuitif) : choisir à chaque étape l'activité compatible qui finit le plus tôt, car elle libère le temps au plus vite.

def selection_activites(activites):
    activites = sorted(activites, key=lambda x: x[1])   # tri par heure de fin
    choisies = []
    fin = 0
    for debut, f in activites:
        if debut >= fin:            # compatible avec la derniere choisie
            choisies.append((debut, f))
            fin = f
    return choisies

acts = [(1, 4), (3, 5), (0, 6), (5, 7), (8, 11), (12, 16)]
print(selection_activites(acts))   # [(1, 4), (5, 7), (8, 11), (12, 16)]
🔍 Décryptage ligne par ligne
activites = sorted(activites, key=lambda x: x[1])On trie les activités par heure de fin croissante. x[1] est le deuxième élément du couple (début, fin), donc la fin. C'est LE critère glouton de ce problème.
choisies = []Liste des activités retenues.
fin = 0Heure de fin de la dernière activité choisie. Au départ, aucune activité choisie, on met 0 (avant tout).
for debut, f in activites:On parcourt les activités dans l'ordre de fin croissante. debut et f sont le début et la fin de l'activité courante.
if debut >= fin:On garde l'activité seulement si elle commence après (ou pile à) la fin de la dernière retenue : pas de chevauchement.
choisies.append((debut, f))On l'ajoute à la sélection.
fin = fOn met à jour l'heure de fin de référence : les prochaines activités devront commencer après f.
Trace de la sélection d'activités (déjà triées par fin) — on garde si debut >= fin
Activité (début, fin)fin avantdebut >= fin ?Décision
(1, 4)01 ≥ 0 : ouion garde → fin = 4
(3, 5)43 ≥ 4 : nonon jette
(0, 6)40 ≥ 4 : nonon jette
(5, 7)45 ≥ 4 : ouion garde → fin = 7
(8, 11)78 ≥ 7 : ouion garde → fin = 11
(12, 16)1112 ≥ 11 : ouion garde → 4 activités ✓
💡 Pourquoi « finir tôt » et pas « commencer tôt » ni « la plus courte » ? Choisir l'activité qui finit le plus tôt laisse le maximum de temps disponible pour la suite. Les critères « commencer le plus tôt » ou « la plus courte » semblent raisonnables mais donnent des contre-exemples : une activité qui commence tôt peut monopoliser toute la journée. Ici, le bon critère glouton est optimal — mais ce n'était pas évident a priori.
📝 À retenir. Le même paradigme (glouton) donne l'optimum pour la sélection d'activités et pour l'euro, mais échoue pour le système . L'optimalité n'est jamais automatique : elle se prouve (hors programme en Sup) ou se réfute par contre-exemple.

5. Reconnaître un problème glouton — et rester méfiant

📐 Méthode — Se poser les bonnes questions
  1. Peut-on décider par étapes ? La solution se construit-elle en ajoutant un objet à la fois ?
  2. Y a-t-il un critère local naturel ? « le plus grand », « celui qui finit le plus tôt », « le moins cher »…
  3. Le critère se justifie-t-il intuitivement ? (« finir tôt libère du temps ».)
  4. Test décisif : puis-je trouver un contre-exemple ? Fabrique de petits cas à la main. Si le glouton échoue une seule fois, il n'est pas optimal.
  5. Si tu ne trouves pas de contre-exemple et que le critère se justifie, le glouton est un bon candidat — mais en Sup, on ne te demande pas de prouver l'optimalité, seulement de la discuter.
📝 Avantages et limites. Points forts du glouton : simple à écrire, rapide (souvent un tri puis un parcours, soit ). Limite : il peut renvoyer une solution correcte mais pas optimale, car un choix irrévocable pris trop tôt peut bloquer la suite. Quand l'optimum est indispensable et que le glouton échoue, on se tourne vers d'autres méthodes (programmation dynamique, exploration exhaustive) — plus lentes mais exactes.
⚠ Le glouton donne toujours UNE solution valide. Ne confonds pas « valide » et « optimale ». Sur pour 6, la réponse [4,1,1] rend bien 6 : elle est valide. Elle n'est simplement pas minimale. L'erreur d'un glouton non optimal n'est jamais de se tromper de total, c'est de ne pas faire au mieux.

6. Exercices corrigés

Exo 1Dérouler le glouton euroFacile

Avec le système euro , donne, à la main, la liste des pièces rendues par rendu_glouton pour la somme 87, et le nombre de pièces.

Voir la correction détaillée
On prend à chaque étape la plus grande pièce reste.
87 → 50 (reste 37) → 20 (reste 17) → 10 (reste 7) → 5 (reste 2) → 2 (reste 0).
Pièces rendues : [50, 20, 10, 5, 2], soit 5 pièces. (Le système euro étant canonique, c'est bien l'optimum.)
Exo 2Construire un contre-exempleIntermédiaire

On considère le système de pièces . Montre que le glouton n'est pas optimal pour rendre la somme 10 : donne le rendu glouton et une meilleure solution.

Voir la correction détaillée
Glouton : plus grande pièce est 8 (reste 2), puis 1 (reste 1), puis 1 (reste 0). Rendu : [8, 1, 1] = 3 pièces.
Meilleure solution : , soit [5, 5] = 2 pièces.
Le glouton (3 pièces) est strictement pire que l'optimum (2 pièces) : n'est donc pas un système canonique. La pièce 8, prise trop tôt, a « gaspillé » deux pièces de 1.
Exo 3Sélection d'activitésDifficile

On dispose des activités données en . Applique le glouton « finir le plus tôt » : donne les activités retenues et leur nombre.

Voir la correction détaillée
Tri par fin croissante : (déjà trié ici).
On part de fin = 0. (1,3) : 1 ≥ 0 → on garde, fin = 3.
(2,5) : 2 ≥ 3 ? non → jetée. (4,7) : 4 ≥ 3 → on garde, fin = 7.
(1,8) : 1 ≥ 7 ? non → jetée. (6,9) : 6 ≥ 7 ? non → jetée. (8,10) : 8 ≥ 7 → on garde, fin = 10.
Activités retenues : , soit 3 activités. C'est l'optimum (le critère « finir tôt » est optimal pour ce problème).

Récap final — Ce qu'il faut absolument retenir

Un glouton avance par étapes, choisit le meilleur localement, ne revient jamais en arrière : rapide, mais pas toujours optimal. Le réflexe d'oral, c'est le contre-exemple.

  • Sais-tu énoncer les trois mots-clés du glouton : par étapes, choix local, irrévocable ?
  • Sais-tu écrire et décrypter le rendu de monnaie glouton (tri décroissant + while somme >= piece) ?
  • Sais-tu dérouler le glouton euro sur une somme donnée, par exemple 68 → [50,10,5,2,1] ?
  • Sais-tu produire le contre-exemple pour 6 : glouton 3 pièces contre optimum 2 () ?
  • Sais-tu qu'un système où le glouton est toujours optimal s'appelle canonique, et que c'est une propriété du système, pas du glouton ?
  • Sais-tu que le glouton donne toujours une solution valide, la question étant seulement de savoir si elle est optimale ?
  • Sais-tu appliquer le glouton « finir le plus tôt » pour la sélection d'activités, et pourquoi ce critère (et pas « commencer tôt ») ?
  • Sais-tu, face à « ce glouton est-il optimal ? », chercher d'abord un contre-exemple avant de répondre ?

Débloque la fiche complète

Théorèmes, démonstrations à savoir refaire, méthodes-types et pièges de concours : crée ton compte gratuit pour tout lire. Une seule fois pour toutes les fiches et ressources Majorant.

Gratuit · vos données restent confidentielles.

Valide tes acquis

Quiz — Gloutons

11 questions · une à la fois · seuil de maîtrise 80 %.

Informatique commune · SupQuiz — Algorithmes gloutonsQuestion 1 / 11
FacileVrai / Faux1 pt

Vrai ou faux : au cours de son exécution, un algorithme glouton peut revenir en arrière et annuler un choix déjà effectué s'il s'aperçoit qu'un meilleur total est possible.

Sélectionne une réponse pour valider.

Fiches associées

📐 MPSI·Informatique

Recherche par dichotomie

La recherche dichotomique dans un tableau trié, expliquée ligne par ligne : code Python commenté, exécution pas à pas, preuve de terminaison et de correction (variant \(d-g\), invariant de boucle), version récursive et complexité \(O(\log n)\).

📐 MPSI·Informatique

Variables, types et affectations

Les briques de base de Python pour bien démarrer la prépa : affectation, types int/float/bool/str, conversions, opérateurs (/ // %), f-strings — avec les pièges classiques et deux exercices corrigés.

📐 MPSI·Informatique

Conditions et booléens

Faire choisir un programme : booléens, comparaisons, if / elif / else, rôle de l'indentation, et combinaison de conditions avec and / or / not — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Boucles for et while

Répéter une action : boucle for avec range, boucle while qui termine, et le motif de l'accumulateur (somme, compteur) — avec table de trace, pièges et exercices corrigés.

📐 MPSI·Informatique

Fonctions : paramètres et valeurs de retour

Définir et appeler une fonction, comprendre paramètres et valeur de retour, et surtout ne jamais confondre return (renvoie) et print (affiche) — avec pièges et exercices corrigés.

📐 MPSI·Informatique

Listes et chaînes de caractères

Créer, indexer, parcourir et découper des listes et des chaînes ; comprendre qu'une liste est modifiable et une chaîne non — avec les pièges d'indices et deux exercices corrigés.

Tu veux aller plus loin sur ce chapitre ?

Nos mentors alumni de Polytechnique, CentraleSupélec et Mines Paris t'accompagnent en cours particuliers — démonstrations détaillées, exos type concours, oraux blancs.

Trouver un mentor →