Adloun

algorithmique (école d'ingénieur) · Chapitre 3 · Application directe du cours

Rendu de monnaie

Sacs avec répétitions, multi-ensembles et couples de sacs · niveau 2

Énoncé

On dispose de pièces de valeurs , en nombre illimité, et l'on doit rendre la somme avec le moins de pièces possible.

  • L'algorithme glouton rend à chaque étape la plus grosse pièce qui ne dépasse pas la somme restante. Le tester avec les pièces pour , , , puis avec les pièces pour et .
  • On note le nombre minimum de pièces pour rendre . Supposons le problème résolu : quelle est la dernière pièce rendue ? En déduire l'équation de récurrence des valeurs .
  • Écrire le programme qui calcule le tableau et affiche les pièces à rendre. Quelle est sa complexité ?

Corrigé

  • Avec , le glouton est optimal sur ces exemples : ( pièces), (), (). Avec et , il rend ( pièces) alors que suffit ; pour , il rend ( pièces) au lieu de ().
  • La dernière pièce rendue est l'une des ; le reste, , est rendu avec un nombre minimum de pièces. Base : . Hérédité : ,

avec si aucune pièce ne convient. C'est un sac avec répétitions où l'on minimise le nombre d'objets sous la contrainte d'une taille exactement égale à . -


static int[] monnaie(int[] P, int S) {
    int[] N = new int[S + 1];                       // base : N[0] = 0
    for (int s = 1; s < S + 1; s++) {              // hérédité, s croissants
        N[s] = INF;
        for (int p : P)
            if (p <= s && N[s - p] + 1 < N[s]) N[s] = N[s - p] + 1;
    }
    return N;
}
static void apieces(int[] N, int[] P, int s) {
    // affiche une façon optimale de rendre s (précondition : N[s] < INF)
    if (s == 0) return;                             // rien à rendre
    for (int p : P)
        if (p <= s && N[s - p] + 1 == N[s]) {       // p peut être la dernière pièce
            apieces(N, P, s - p);                   // s - p a été rendu
            System.out.print(" " + p);              // puis p : s a été rendu
            return;
        }
}

pieces [1, 3, 4], S = 6 : glouton 3 piece(s), optimum 2 : 3 3
pieces [1, 3, 4], S = 10 : glouton 4 piece(s), optimum 3 : 4 3 3

nom : N
valeurs : 0 1 2 1 1 2 2 2 2 3 3
colorier : 10
vert : 0 4 7
fleches : 0->4:+4 4->7:+3 7->10:+3
legende : pièces 1, 3, 4 : N(10) = 3 avec 10 = 4 + 3 + 3

Le calcul est en , l'affichage en au pire (au plus pièces, essais chacune).

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →