# interro_12_2020_monnaie_de_3_euros.py
01| # Nombre de manières de réaliser une somme donnée 02| # avec les pièces usuelles
03|
04| L = [1,2,5,10,20,50,100,200]
05| somme = 500 06| somme_max = 500 07|
08| # Les deux premiers calculent récursivement le nombre 09| # de solutions avec les pièces de L[: i+1]
10|
11| def monnaie(i, somme):
12| if i == 0:
13| return 1 14| else:
15| return sum(monnaie(i-1, somme - nb*L[i]) for nb in range(1 + somme //
L[i])) 16|
17| def monnaie_bis(i, somme):
18| if i == 0 or somme == 0:
19| return 1 20| if somme >= L[i]:
21| return monnaie_bis(i-1, somme) + monnaie_bis(i, somme - L[i]) 22| else:
23| return monnaie_bis(i-1, somme) 24|
25|
26| # Bien plus rapide :
27| monnaie_dynamique = [[0 for s in range(1 + somme_max)] for k in range(len(L))]
28|
29| for s in range(1 + somme_max):
30| monnaie_dynamique[0][s] = 1 31| for k in range(1, len(L)):
32| for s in range(L[k]):
33| monnaie_dynamique[k][s] = monnaie_dynamique[k - 1][s]
34| for s in range(L[k], 1 + somme_max):
35| monnaie_dynamique[k][s] = monnaie_dynamique[k - 1][s] + monnaie_dynamique[k][s - L[k]]
36|
37| # Calcule le résultat avec les k premières pièces connaissant 38| # le résultat avec les k-1 premières pièces.
39|
40| print('résultat : ', monnaie(len(L)-1, somme))
41| print('résultat_bis : ', monnaie_bis(len(L)-1, somme))
42| print('monnaie_dynamique : ', monnaie_dynamique[len(L) - 1][somme]) 43|
44| # s = 100 : 4563, s = 300 : 471363, s = 500 : 6295434 45|
1