IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Récursivité dans un système "monnayeur"


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Récursivité dans un système "monnayeur"
    Bonsoir,

    Voilà je dois réaliser l'algorithme et le codage en Pascal d'un "monayeur non optimisé". Ce que j'entends par là c'est qu'on dispose de pièces de monnaie (2€, 1€, 0,5€, 0,2€, 0,1€, 0,05€, 0,02€, 0,01€) et que l'on doit donner le nombre de possibilités de faire l'appoint. J'appelle "non optimisé" le fait que le monnayeur ne doit pas calculer la meilleure façon de rendre l'argent (avec le moins de pièces possibles), mais qu'il doit nous donner toutes les possibilités. Et c'est bien là que je bloque.
    J'ai tenté de découvrir une formule générale de récurrence mais je ne pense pas qu'il faille passer par là : en effet c'est un exercice sur la récursivité, qui a pour suite le même monnayeur mais cette fois avec un nombre limité pour chaque pièce.

    Voilà, je comprends bien comme "optimiser" la machine pour qu'elle rende le moins de pièces possibles, mais je ne sais pas comment faire pour le reste, ça fait des heures que je suis dessus et je bloque

    Un ptit coup de pouce serait le bienvenu... merci d'avance.

    Bonne soirée,
    TiteFleur

  2. #2
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    votre problème est d'ordre algorithmique et non de codage PASCAL ==> post déplacé dans la rubrique "algorithmes"

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Définissons une solution intermédiaire de niveau N+1 comme une solution comportant une combinaison de pièces toutes supérieures à m centimes d'euros + une somme S résiduelle.

    A partir d'une solution intermédiaire de niveau N'=N+1 (example m'=50cts), et avec une somme résiduelle égale à S' on générera pour le niveau N (example n=20cts) X solutions intermédiaires telles que X=S'/m et S=S'-i*n, i variant de 0 à X.

    On commence par une solution intiale unique avec S=somme à rendre et on traite chaque niveau N (N=1 m=200, N=2 m=100, N=3 m=50 .... m=1).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    trouver toute les solutions va souvent avec récurrence.
    Il te faut donc une procédure du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure(Somme)
    debut
    si somme = rendu alors ecrire resultat et retourner
    si somme > rendu alors retourner
     
    Ajouter une piece de type 1 et appeler procedure(Somme+valeur Type 1).
    Ajouter une piece de type 2 et appeler procedure(Somme+valeur Type 2).
    ...
    Ajouter une piece de type N et appeler procedure(Somme+valeur Type N).
    Fin
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Une solution ne serait-elle pas de se dire :
    mon monnayeur n'a que des pièces de 0,01 €, quelle solution ,
    Il n'a qu 'une pièce de 0,02 €, quelle solution
    Il a 2 pièces de 0,02€, il a 3 pièces, quand on a tout epuisé pour les pièces de 0,02 €, on recommence tout le cycle avec une pièce de 0,05 €, puis deux pièces de 0,05 € ...
    On peut ainsi trouver une méthode itérative et après pourquoi pas récursive.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par ToTo13
    Bonjour,

    trouver toute les solutions va souvent avec récurrence.
    Il te faut donc une procédure du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure(Somme)
    debut
    si somme = rendu alors ecrire resultat et retourner
    si somme > rendu alors retourner
     
    Ajouter une piece de type 1 et appeler procedure(Somme+valeur Type 1).
    Ajouter une piece de type 2 et appeler procedure(Somme+valeur Type 2).
    ...
    Ajouter une piece de type N et appeler procedure(Somme+valeur Type N).
    Fin
    Il manque juste à se limiter au nombre de pièces disponibles et à éviter de noter plusieurs fois la même combinaison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Valeurs[NombreDeTypeDePièces] = {0.1, 0.2, 0.5, 0.10 ...}
    NbPiecesDispo[NombreDeTypeDePièces] = {10, 5, 6 ...}
    NbPieces[NombreDeTypeDePièces] = {0, 0, ...}
     
    procedure(Somme, Type)
    debut
       si Somme = rendu alors ecrire NbPieces et retourner
       si Somme > rendu alors retourner
     
       Pour i de Type à NombreDeTypeDePièces
          Si NbPieces[i] < NbPiecesDispo[i] alors
             NbPieces[i] = NbPieces[i] + 1
             procedure(Somme+Valeurs[i], i)
             NbPieces[i] = NbPieces[i] - 1
          fin si
       fin pour
    fin
    Il y a un peu trop de variables globales mais c'est pour le principe.

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    J'ai donné un code source ( en C ) sur ce forum qui resoud exactement ce probleme
    voir
    http://www.developpez.net/forums/sho...d.php?t=210755
    dans
    A.X1 + B.X2 + ... + Y.Xn = TOTAL
    if suffit de prendre A=200, B=100 D=50 E=20 F=10 G=5 H=2 et I=1, limiter le système à 9 variables et mettre total en "centi" Euro
    Le code, autant que je me souvienne, devrait donner ici des doublons à supprimer ( l'ordre n'intervient pas ici )

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Voici un code C basé sur mon principe de résolution, attention, c'est un test, le code n'est pas secure du tout, il utilise des globales et il est limité à 256 solutions.
    Il travaille sur des sommes en centimes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <string.h>
     
    int pieces[] = {1, 2, 5, 10, 20, 50, 100, 200};
    char *nom[] = {"0,01", "0,02", "0,05", "0,10", 
                    "0,20", "0,50", "1", "2"};
     
    #define nbP (sizeof(pieces)/sizeof(pieces[0]))
     
    int res[256][8];
    int nbL;
     
    void insert_resultat(int *t)
    {
    	memcpy(res[nbL], t, sizeof(res[nbL]));
    	nbL ++;
    }
     
    void Calcule(int s, int ind, int *t)
    {
    	int i = 0;
    	if (ind == 0)
    	{
    		t[ind] = s;
    		insert_resultat(t);
    	}
    	else
    	{
    		while (i * pieces[ind] <= s)
    		{
    			t[ind] = i;
     
    			Calcule(s - i * pieces[ind], ind - 1, t);
    			i++;
    		}
    	}
     
    }
     
     
    // affichage de la somme avec les pièces 
    void Affiche(void)
    {
    	int i ;
    	for(i = 0; i < nbL; i++)
    	{
    		int j;
    		for( j = 0; j < nbP; j++)
    			printf("%3d\t", res[i][j]);
     
    		puts("");
    	}
    }
    int main(void)
    {
       int S = 17;
       int t[8] = {0};
     
       nbL = 0;
       Calcule(S, nbP-1, t);
     
       Affiche();
     
       return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Modification d'un texte dans une fenetre "d'erreur"
    Par PAUL87 dans le forum Access
    Réponses: 8
    Dernier message: 21/10/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo