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 :

Rendu de monnaie + CombinaisonS


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut Rendu de monnaie + CombinaisonS
    bonjour,
    j'ai vu a travers différents forum que l'algorithme glouton est très intéressant pour résoudre un certains nombre de programme cependant j'ai un problème pour ce qui est d'obtenir toutes les combinaisons possibles...
    par exemple nous avons 400e et les billets et pièces de 200 100 50 20 10, et je n'arrive pas a obtenir toutes les combinaisons...

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Par défaut
    Bonjour,

    Ta question est en quelque sorte la suite du fil de bgre25.

    Dans les problèmes que vous posez, il n'y a pas de contraintes sur le contenu de la "caisse" (car on a autant de billets et pièces qu'on veut : donc on peut toujours compléter par des pièces de 1€ si nécessaire, et donc il y a toujours une solution).

    Tu as un montant à atteindre (par exemple : 400 €).
    Et des billets ou pièces : 200 100 50 20 et 10 €.

    Pour un billet de 200 : tu as trois choix : en prendre 0, 1 ou 2.
    Pour un billet de 100 : tu as le choix en fonction des billets de 200 que tu as déjà choisi :
    Si tu as choisi 0 billet de 200 : il te reste 400, et donc tu as 0, 1, 2, 3 ou 4 choix pour le billet de 100.
    Si tu as choisi 1 billet de 200 : il te reste 200, et donc tu as 0, 1 ou 2 choix pour le billet de 100.
    etc...

    Donc ton algo peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Considérer les billets dans l'ordre décroissant : 200, 100, 50, 20 et 10.
    Pour atteindre 400, pour chacun des choix possibles pour un billet de 200 :
           Faire ce choix de b billets.
           Il te reste 400 - (b * 200).
           Recommencer (de manière récursive) pour atteindre 400 - (b * 200) avec les billets 100, 50, 20, 10.
     
    Si tu es sur 10 (le dernier billet) : tu as l'obligation de compléter. Donc un seul choix possible.
    J'espère que cela t'aidera.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    je te remercie pour cette aide...je vais essayer dans la soirée pour voir ce que cela donne..et jte donne ma réponse!

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Cet algorithme va provoquer une explosion combinatoire, il faut utiliser la programmation dynamique (ou la mémoisation, son miroir) pour réduire cette explosion.

    --
    Jedaï

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Par défaut
    Exact, Jedai... je ne m'attendais pas à ce qu'il y a ait autant de solutions

    Voici une autre proposition (en C#) :

    Code C# : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace RenduDeMonaie
    {
        class Program
        {
            static void Main( string[] args )
            {
                int somme = 400;
                int[] monaies = { 200, 100, 50, 20, 10, 5, 2, 1 };
     
                AfficherObjectif( somme, monaies );
     
                int numero = 1;
                foreach ( int[] combinaison in Combinaisons( somme, monaies ) )
                {
                    AfficherSolution( numero, monaies, combinaison );
                    numero++;
                }
            }
     
            static void AfficherObjectif( int somme, int[] monaies )
            {
                Console.WriteLine( "Objectif : {0}", somme );
                Console.Write( "Monaie : " );
                for ( int i = 0 ; i < monaies.Length ; i++ )
                {
                    Console.Write( monaies[i] );
                    Console.Write( '/' );
                }
                Console.WriteLine();
            }
     
            static void AfficherSolution( int numero, int[] monaies, int[] combinaison )
            {
                Console.Write( " >{0} : ", numero );
                for ( int i = 0 ; i < monaies.Length ; i++ )
                {
                    Console.Write( combinaison[i] );
                    Console.Write( "(" );
                    Console.Write( monaies[i] );
                    Console.Write( ")/ " );
                }
                Console.WriteLine();
            }
     
            static IEnumerable<int[]> Combinaisons( int somme, int[] monaies )
            {
                int positionUnite = monaies.Length - 1;
     
                int[] cumuls = new int[monaies.Length];
                int[] valeurs = new int[monaies.Length];
     
                cumuls.Initialize();
                valeurs.Initialize();
     
                bool continuer = true;
     
                while ( continuer )
                {
                    valeurs[positionUnite] = somme - (cumuls[positionUnite - 1] / monaies[positionUnite]);
                    cumuls[positionUnite] = cumuls[positionUnite - 1] + (valeurs[positionUnite] * monaies[positionUnite]);
     
                    if ( cumuls[positionUnite] == somme )
                        yield return valeurs;
     
                    continuer = Suivant( valeurs, cumuls, monaies, somme, positionUnite );
                }
            }
     
            static bool Suivant( int[] valeurs, int[] cumuls, int[] monaies, int somme, int positionUnite )
            {
                int index = positionUnite - 1;
     
                while ( index >= 0 )
                {
                    valeurs[index]++;
                    cumuls[index] = (index == 0 ? 0 : cumuls[index - 1]) + valeurs[index] * monaies[index];
     
                    if ( cumuls[index] > somme )
                    {
                        cumuls[index] = 0;
                        valeurs[index] = 0;
                        index--;
                    }
                    else
                        return true;
                }
     
                return false;
            }
        }
    }

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    @Alikendarfen: J'ai essayé de suivre ton code mais je me suis perdu . Tu as mis une relation d'ordre sur les solutions, c'est ca ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Algo rendu de monnaie
    Par Matt_NewDev dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 28/03/2012, 17h24
  2. Algorithme glouton et problème du rendu de monnaie
    Par quentinzone dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/01/2012, 11h49
  3. Rendu de monnaie
    Par bgre25 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 13/05/2008, 19h55
  4. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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