From d19085ed45372e7ef56fde4d2513e7cded730640 Mon Sep 17 00:00:00 2001 From: Ryad MEHIRI Date: Wed, 21 Oct 2026 10:53:24 +0200 Subject: [PATCH] =?UTF-8?q?F8=20:=20rendu=20de=20monnaie=20par=20programma?= =?UTF-8?q?tion=20dynamique=20(O(S=20=C3=97=20k))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La récursion naïve recalculait les mêmes sous-problèmes : 266 723 739 appels pour rendre 400 centimes avec 8 pièces. Le tableau facons[0..S], mis à jour pièce par pièce, compte les mêmes combinaisons en S × k additions (3 200 ici). Temps (-O2) : 1,17 s → 1,00 s. En -O0 -pg, le surcoût de _mcount (16,2 s) disparaît avec les appels récursifs. Empreinte inchangée (ff68d260a7a58441). Co-Authored-By: Claude Opus 5.5 --- banque.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/banque.c b/banque.c index b635bc0..da5a186 100644 --- a/banque.c +++ b/banque.c @@ -171,14 +171,18 @@ long nb_paires_opposees(const Transaction *t, int n) static const int PIECES[] = {1, 2, 5, 10, 20, 50, 100, 200}; #define NB_PIECES 8 +/* Programmation dynamique : après avoir traité les p premières pièces, + * facons[s] est le nombre de façons de rendre s avec ces pièces. */ long nb_facons_rendre(int somme, int nb_pieces) { - if (somme == 0) - return 1; - if (somme < 0 || nb_pieces == 0) - return 0; - return nb_facons_rendre(somme - PIECES[nb_pieces - 1], nb_pieces) + - nb_facons_rendre(somme, nb_pieces - 1); + long *facons = calloc(somme + 1, sizeof(long)); + facons[0] = 1; + for (int p = 0; p < nb_pieces; p++) + for (int s = PIECES[p]; s <= somme; s++) + facons[s] += facons[s - PIECES[p]]; + long resultat = facons[somme]; + free(facons); + return resultat; } /* F9 : catégorie d'une transaction (pour les statistiques) */