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 .
- Écrire les deux programmes que l'on obtient selon l'ordre des deux boucles.
- Que compte chacun ? Le vérifier à la main sur avec .
- Donner les deux suites de valeurs pour à , et reconnaître l'une d'elles.
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.
- (A) compte les combinaisons : les multi-ensembles de pièces, sans tenir compte de l'ordre. La boucle extérieure sur les pièces impose un ordre de considération : quand on traite la pièce , toutes les façons déjà comptées n'utilisent que . On ne peut donc jamais compter deux fois le même multi-ensemble dans deux ordres différents.
- (B) compte les compositions : les suites de pièces, l'ordre comptant. La boucle extérieure sur laisse toutes les pièces disponibles à chaque étape, et est compté séparément de .
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.