algorithmique (école d'ingénieur) · Chapitre 2 · Application directe du cours
Compter les sous-ensembles
Le sac de valeur maximum · niveau 2
Énoncé
On ne veut plus savoir s'il existe un sous-ensemble de de somme , mais combien il en existe. On note le nombre de sous-ensembles des premiers éléments de somme .
- Donner l'équation de récurrence des valeurs . Que vaut ? Pourquoi ?
- Écrire la fonction
long compter(int[] X, int S). - Combien de sous-ensembles de ont pour somme ? Les énumérer. Et de pour la somme ?
Corrigé
- Les sous-ensembles des premiers éléments de somme se partagent en deux familles disjointes : ceux qui ne contiennent pas (il y en a ) et ceux qui le contiennent (autant que de sous-ensembles des premiers de somme ). On additionne au lieu de prendre un maximum. Base : (le sous-ensemble vide a pour somme , et c'est le seul sous-ensemble de l'ensemble vide), pour . Hérédité : , ,
-
static long compter(int[] X, int S) { int n = X.length;
long[][] N = new long[n + 1][S + 1];
N[0][0] = 1; // base
for (int k = 1; k < n + 1; k++)
for (int s = 0; s < S + 1; s++)
N[k][s] = N[k-1][s] + (X[k-1] <= s ? N[k-1][s - X[k-1]] : 0);
return N[n][S];
}
- Le programme donne sous-ensembles de de somme : , , . Pour et la somme , il en trouve . Les nombres de sous-ensembles croissent vite : on utilise des
long.
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.