algorithmique (école d'ingénieur) · Chapitre 1 · Application directe du cours
Le cambrioleur prudent
Glouton ou dynamique ? · niveau 2
Énoncé
Une rue compte maisons alignées ; la maison contient un butin . Un cambrioleur prudent ne visite jamais deux maisons voisines (l'alarme de l'une réveillerait l'autre). Il veut un butin total maximum.
- Sur , que donne la stratégie gloutonne « la maison la plus riche encore autorisée d'abord » ?
- On note le butin maximum sur les premières maisons. Supposons le problème résolu et regardons la maison : donner l'équation de récurrence des valeurs .
- Écrire
calculerMet une fonction récursive qui affiche les maisons visitées. Donner le résultat sur l'exemple.
Corrigé
- Le glouton prend la maison (butin ), ce qui interdit les maisons et ; puis la maison (), ce qui interdit et . Butin . Or les maisons , , donnent .
nom : x
valeurs : 6 9 6 1 8 7
colorier : 1 4
griser : 0 2 3 5
legende : glouton : maisons 1 et 4, butin 9 + 8 = 17
nom : x
valeurs : 6 9 6 1 8 7
vert : 0 2 4
legende : optimum : maisons 0, 2 et 4, butin 6 + 6 + 8 = 20
- Supposons le problème résolu sur les premières maisons. Ou bien la maison n'est pas visitée, et le butin est ; ou bien elle l'est, la maison ne l'est pas, et le butin est . Base : , . Hérédité : ,
-
static int[] calculerM(int[] x) { int n = x.length;
int[] M = new int[n + 1];
M[0] = 0; // base
if (n > 0) M[1] = x[0];
for (int k = 2; k < n + 1; k++) // hérédité
M[k] = Math.max(M[k-1], M[k-2] + x[k-1]);
return M;
}
static void amaisons(int[] M, int[] x, int k) {
// affiche les maisons visitées parmi les k premières
if (k <= 0) return;
if (k == 1) { if (M[1] > 0) System.out.print(" 0"); return; }
if (M[k] == M[k-1]) amaisons(M, x, k-1); // la maison k-1 n'est pas visitée
else { amaisons(M, x, k-2); System.out.print(" " + (k-1)); }
}
x = [6, 9, 6, 1, 8, 7]
glouton (plus grande valeur disponible d'abord) : 17
M = [0, 6, 9, 12, 12, 20, 20]
somme maximum 20 : maisons 0 2 4
nom : M
valeurs : 0 6 9 12 12 20 20
colorier : 6
vert : 1 3 5
fleches : 6->5 5->3:+8 3->1:+6
legende : remontée : M[6] = M[5], puis maisons 4 (+8), 2 (+6) et 0 (+6)
Le calcul et l'affichage sont en .
100 % gratuit
La suite du chapitre est sur Adloun
- 10 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.