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
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
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.