Adloun

algorithmique (école d'ingénieur) · Chapitre 3 · Exercice de TD

Deux sacs : le tableau des choix

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

Énoncé

On reprend l'exemple du cours : quatre objets de tailles et de valeurs , contenances et .

  • Calculer à la main pour en indiquant à chaque fois le cas retenu.
  • Ajouter au programme un tableau de même forme que , qui mémorise pour chaque case le cas retenu ( : objet dans aucun sac, : dans , : dans ), et réécrire acsm à l'aide de ce seul tableau.
  • Le problème est symétrique : . Comment en tirer parti pour diviser la mémoire par deux environ ?

Corrigé

  • On applique l'hérédité à trois cas du cours :
  • (base) ;
  • : l'objet (taille ) va dans (cas , premier cas trouvé en cas d'égalité) ;
  • : l'objet (taille ) va dans avec (l'objet dans ) ;
  • : l'objet va dans , avec ;
  • : l'objet (taille ) ne fait pas mieux : cas .
  • On remplit en même temps que :

M[k][c0][c1] = M[k-1][c0][c1]; A[k][c0][c1] = 0;          // dans aucun sac
if (t <= c0 && v + M[k-1][c0-t][c1] > M[k][c0][c1]) {
    M[k][c0][c1] = v + M[k-1][c0-t][c1]; A[k][c0][c1] = 1; // dans S0
}
if (t <= c1 && v + M[k-1][c0][c1-t] > M[k][c0][c1]) {
    M[k][c0][c1] = v + M[k-1][c0][c1-t]; A[k][c0][c1] = 2; // dans S1
}

puis l'affichage n'a plus besoin de :


static void acsm(int[][][] A, int[] V, int[] T, int k, int c0, int c1) {
    if (k == 0) return;                                 // sacs vides
    int a = A[k][c0][c1], t = T[k-1];
    if (a == 0) acsm(A, V, T, k-1, c0, c1);
    else if (a == 1) { acsm(A, V, T, k-1, c0-t, c1); System.out.printf("objet %d -> S0%n", k-1); }
    else { acsm(A, V, T, k-1, c0, c1-t); System.out.printf("objet %d -> S1%n", k-1); }
}

Il affiche l'objet dans et les objets et dans , pour une valeur .

  • On peut supposer et ne calculer que ces cases : pour , on lit . Lorsque , cela divise par deux environ la mémoire (et le temps) ; en Java, on alloue des lignes de longueurs différentes (tableau « en triangle »). Si , le gain se limite au carré .

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 →