Adloun

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

Une seule ligne suffit

Le sac de valeur maximum · niveau 2

Énoncé

Pour calculer la seule valeur (sans reconstruire le sac), il est inutile de garder tout le tableau .

  • Pourquoi deux lignes suffisent-elles ? Quelle est alors la mémoire utilisée ?
  • Montrer qu'un seul tableau de cases suffit, à condition de parcourir les contenances par décroissants. Écrire la fonction.
  • Que calcule-t-on si on parcourt les contenances par croissants ? Tester sur l'exemple du cours (, , ).

Corrigé

  • La ligne de ne dépend que de la ligne . On garde deux tableaux prec et cour de cases, que l'on échange à chaque : mémoire au lieu de , temps toujours .
  • Dans un seul tableau , au début du tour , contient la ligne . Pour calculer la nouvelle valeur de , il faut l'ancienne valeur de et l'ancienne valeur de , avec . Si l'on parcourt les par valeurs décroissantes, la case n'a pas encore été modifiée pendant ce tour : elle contient bien .

static int uneLigne(int[] V, int[] T, int C) {
    int[] L = new int[C + 1];                   // ligne 0 : que des zéros
    for (int k = 1; k < V.length + 1; k++)
        // invariant : L[0:c+1] est la ligne k-1, L[c+1:C+1] est la ligne k
        for (int c = C; c >= T[k-1]; c--)
            L[c] = Math.max(L[c], V[k-1] + L[c - T[k-1]]);
    return L[C];                                  // L est la ligne n
}

Les cases ne changent pas : .


nom : L
valeurs : 0 0 0 4 4 4 4 9 9 11 11
colorier : 6
vert : 7..10
fleches : 4->6:+5
zone : 0..6 ligne 2
zone : 7..10 ligne 3
legende : exemple du cours, tour k = 3 (t = 2), c = 6 : L[4] vaut encore m(2,4)
  • Par croissants, a déjà été mis à jour pendant le tour : il peut contenir l'objet , que l'on ajoute alors une deuxième fois. On calcule le sac avec répétitions du chapitre 3. Sur l'exemple, la version décroissante donne (le bon résultat) et la version croissante (cinq exemplaires de l'objet de taille et de valeur ).

nom : L
valeurs : 0 0 5 5 10 10 4 4 4 11 11
colorier : 6
vert : 2..5
fleches : 4->6:+5
zone : 2..5 déjà modifiées
zone : 6..10 ligne 2
legende : par c croissants, L[4] = 10 compte déjà deux fois l'objet 2

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 →