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) */