Inscription / Connexion Nouveau Sujet
Niveau exercices
Partager :

Rendu de monnaie

Posté par
flight
30-07-22 à 17:07

Bonjour

Je vous, propose le petit exercice simple suivant

Un caissier de magasin dispose d un nombre important de billets de 50, 20, 10 et 5€.
De combien de façon peut il rendre 100 € à un client

Posté par
ty59847
re : Rendu de monnaie 30-07-22 à 18:45

 Cliquez pour afficher


je pensais pas qu'il y en aurait autant !

Posté par
carpediem
re : Rendu de monnaie 30-07-22 à 18:52

salut

 Cliquez pour afficher


en espérant bien compter ...

et je remercie par avance tous ceux qui me sortiront un super algo python (mais sans fonction trop exotique ou kabbalistique ou alors oui mais un autre sans) qui nous donne la solution ...

Posté par
carpediem
re : Rendu de monnaie 30-07-22 à 18:54

ty59847 : j'avais commencé avant toi et comme toi ... mais écrire tout m'a gonflé au bout de la vingtaine donc j'ai "résumé" !!

Posté par
ty59847
re : Rendu de monnaie 30-07-22 à 19:21

Avant moi, c'est pas sûr. Ca m'a pris pas mal de temps pour tout taper !
Même si Copier/coller, c'est bien pratique !

Posté par
carpediem
re : Rendu de monnaie 30-07-22 à 20:44

quand j'ai commencé il n'y avait aucune réponse mais il est vrai que ça ne veut pas dire que tu n'avais pas commencé avant : j'ai bien du y passer un bon 1/4 d'heure à écrire toutes les solutions jusqu'à 0 * 50 et v * 20 avec v prenant les valeurs 5; 4, 3, 2 et 1 ...

puis je me suis mis à réfléchir ... et tout effacer pour reprendre avec des équations et le comptage des solutions .: en 2 mn et 60 s j'avais fini !!!

il est toujours bon de réfléchir avant de penser !!!

Posté par
Ulmiere
re : Rendu de monnaie 30-07-22 à 20:53

Un grand classique pour apprendre aux étudiants à utiliser la programmation dynamique et HJB

La bonne idée c'est de partir du résultat et d'essayer d'atteindre un point initial par soustractions

Citation :
je remercie par avance tous ceux qui me sortiront un super algo python


A vos ordres

def monnaie(n):
	billets = [5, 10, 20, 50]
	billet_min = billets[0]
	cache = {5: 1, 10: 2}
	
	def monnaie_aux(n):
		if n < billet_min:
			cache[n] = 0
		if n in cache:
			return cache[n]
		
		u = int(n in billets)
		
		for billet in billets:
			N = n - billet
			possib_N = monnaie_aux(N)
			if possib_N > 0:
				u += possib_N
		
		cache[n] = u
		return u
	
	return monnaie_aux(n)

print(monnaie(100))


et voici un code beaucoup plus dégueulasse et lent qui permet d'énumérer toutes les possibilités en prenant en compte ou pas l'ordre des billets. Sous-optimal, on peut faire bien mieux.


cache_aboule = {5: {(5,)}, 10: {(10,), (5,5)}}
billets = [5, 10, 20, 50] # toujours dans l'ordre croissant et non vide
billet_min = billets[0]

def aboule_le_fric(n):
	if n == 0:
		return set(tuple())
		
	if n < billet_min:
		return None
	if n in cache_aboule:
		return cache_aboule[n]
	
	aboule_n = set()
	
	
	
	for billet in billets:
		N = n - billet
		if N < billet_min:
			break		
	
		if N not in cache_aboule:
			cache_aboule[N] = aboule_le_fric(N)
			
		aboule_N = cache_aboule[N]		
		if aboule_N is not None:
			aboule_n |= set(map(lambda a: tuple(list(a)+[billet]), filter(lambda a: a is not None, aboule_N)))
	
	if n in billets:
		aboule_n |= {(n,)}
	
	if len(aboule_n) == 0 or aboule_n == {None}:
		aboule_n = None
		
	cache_aboule[n] = aboule_n
	return aboule_n
	
r = aboule_le_fric(100)
print("en prenant en compte l'ordre: ", len(r))

s = set(tuple(sorted(k)) for k in r)
print("à l'ordre près: ", len(s))
for u in s:
	print(u)



Et le résultat que ça me sort:

 Cliquez pour afficher


On peut aussi se passer de récursion, mais j'ai plus de place dans ce post

Posté par
flight
re : Rendu de monnaie 31-07-22 à 00:19

bravo à tous !   c'est bien 49 facons de faire  
ma methode super rapide :

50x + 20y + 10z +  5 t = 100    est la meme chose que  
10x +  4y + 2z + t = 20 .
x peut prendre les valeurs  0,1 ou 2   ( pas plus )
si x = 0  alors  4y +2z+t= 20
  y peut prendre les valeurs  {0,1,2,3,4,5}
    si y =0 --> 2z+t = 20 -->z {0,1,2,...10} soit
  11 solutions
    si y =1 --> 2z+t = 16 -->z {0,1,2,...8} soit 9 solutions
    si y =2 --> 2z+t = 12 -->z {0,1,2,...6} soit 7 solutions
    si y =3 --> 2z+t = 8 -->z {0,1,2,3,4} soit 5 solutions
   si y =4 --> 2z+t = 4 -->z {0,1,2 soit 3 solutions
   si y =5 --> 2z+t = 0 -->z {0} soit 1 solution

si x = 1  ---> 4y+2z+t=10
   y peut prendre les valeur  0,1 ou 2
     si y =0 --> 2z+t = 10 -->z {0,1,2,...5} soit 6 solutions
    si y =1 --> 2z+t = 6 -->z {0,1,2,3} soit 4 solutions
   si y =2 --> 2z+t = 2 -->z {0,1} soit  2 solutions.

finalement si x = 2    alors  4y+2z+t=0   et ici c'est tres rapide  
un seul triplet solution (2,0,0,0)    soit  1 solution


total 11 +9+7+5+3+1) + (6+4+2) + 1 = 49 solutions

Posté par
dpi
re : Rendu de monnaie 31-07-22 à 09:00

Bonjour,

 Cliquez pour afficher

Posté par
flight
re : Rendu de monnaie 31-07-22 à 09:42

salut dpi    ..60 ne convient pas ...

Posté par
dpi
re : Rendu de monnaie 31-07-22 à 09:58

Ouf

 Cliquez pour afficher

Posté par
dpi
re : Rendu de monnaie 31-07-22 à 10:16

Pour mémoire

 Cliquez pour afficher

Posté par
flight
re : Rendu de monnaie 31-07-22 à 10:59

49 c'est parfait ! bravo

Posté par
lake
re : Rendu de monnaie 01-08-22 à 15:46

Bonjour,

  

 Cliquez pour afficher

Posté par
flight
re : Rendu de monnaie 01-08-22 à 22:33

bravo

Posté par
jandri Correcteur
re : Rendu de monnaie 01-08-22 à 23:05

Bonjour lake,

il y a une imprécision dans ta formule :

l'équation 50x+20y+10z+5w=nn\in\mathbb{N} n'a des solutions que si 5 divise n.

Il faut donc supposer que n=5N et alors m=[N/2]

Posté par
jandri Correcteur
re : Rendu de monnaie 01-08-22 à 23:14

De plus il y a le même nombre de solutions pour N=2m et N=2m+1.

Ta formule donne donc la valeur de u_{10m}=u_{10m+5}.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !