Faudra penser à celui qui passe les pièces dans l'ordre croissant (ex print(tuple(rendumonnaie(((1, 2), (3, 2), (4, 1)), 6)))) car là il ne sort pas la solution 4, 1, 1 (oui, le test du couillon dans sa plus pure expression). Un petit tri au début de la fonction peut-être...
Il y a encore un petit défaut de syntaxe ici: if arendre > sum([p*n for p, n in C]). C'est if arendre > sum(p*n for p, n in C) qu'il faut écrire.
On pourrait penser que c'est équivalent (et dans le cas actuel, si on néglige la ram inutilement consommée, ça l'est) mais c'est une mauvaise habitude d'intégrer un tuple/list dans un truc qui est déjà fait pour traiter un itérable, car bien souvent ledit truc fonctionne à l'économie mais si on lui passe un tuple/list, tuple/list alors entièrement créé avant l'appel, l'économie ne se fait plus.
ExempleCode:
1
2
3 def fct(n): print(n) return n == 5
Si on écrit print(any([fct(x) for x in range(10)])) on aura à l'écran tous les chiffres de 0 à 9 avant d'avoir le résultat True, résultat pourtant inévitable sitôt le 5 atteint. Mais si on écrit print(any(fct(x) for x in range(10))) là on voit la recherche s'arrêter au 5 ;)