Adloun

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

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 →