Adloun

Probleme – Compter au lieu d'optimiser : combinaisons ou compositions ?

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 17 — Programmation dynamique

Énoncé

On ne cherche plus le nombre minimal de pièces, mais le nombre de façons de rendre une somme avec un système de pièces .

Corrigé

1. Les deux programmes ne diffèrent que par l'ordre des boucles :


/* (A) pieces a l'exterieur */
int a[S + 1]; a[0] = 1; for (int s = 1; s <= S; s++) { a[s] = 0; }
for (int i = 0; i < k; i = i + 1) {
    for (int s = p[i]; s <= S; s = s + 1) { a[s] = a[s] + a[s - p[i]]; }
}

/* (B) sommes a l'exterieur */
int b[S + 1]; b[0] = 1; for (int s = 1; s <= S; s++) { b[s] = 0; }
for (int s = 1; s <= S; s = s + 1) {
    for (int i = 0; i < k; i = i + 1) {
        if (p[i] <= s) { b[s] = b[s] + b[s - p[i]]; }
    }
}

2. Ce que chacun compte.

Vérification à la main, et .

Combinaisons : , , — trois.

Compositions, énumérées par le programme :


(1,1,1,1,1) (1,1,1,2) (1,1,2,1) (1,2,1,1) (1,2,2) (2,1,1,1) (2,1,2) (2,2,1)

huit.

3. Les deux suites, pour à et :


S              0  1  2  3  4  5  6  7  8
(A) combinaisons  1  1  2  2  3  3  4  4  5
(B) compositions  1  1  2  3  5  8 13 21 34

La seconde ligne est la suite de Fibonacci, et ce n'est pas un accident : une composition de avec des et des commence par un (il reste ) ou par un (il reste ), donc . La première ligne vaut : le nombre de détermine la combinaison.

Avec et , la mesure donne combinaisons contre compositions.

La morale, et elle vaut pour tout le chapitre. On a écrit deux algorithmes en croyant en écrire un. Ni l'un ni l'autre n'est faux : ils répondent à deux questions différentes, et le code ne dit pas laquelle. L'ordre des boucles est une partie de la spécification — au même titre que le sens de parcours de l'exercice sur le sac à dos en une ligne, et pour la même raison profonde : il décide de ce qui est déjà écrit dans la table quand on la lit.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.