Algorithme pour déterminer pièce de combinaisons
J'ai récemment été confronté à une invite pour un algorithme de programmation que je n'avais aucune idée de quoi faire. Je n'ai jamais vraiment écrit un algorithme avant, donc je suis un newb.
Le problème dit d'écrire un programme pour déterminer l'ensemble de la pièce possible de combinaisons pour un caissier de donner en retour que du changement fondée sur des valeurs de pièces et le nombre de pièces. Par exemple, il pourrait être une monnaie avec 4 pièces: 2 cent, 6 cent, 10 cent et 15 pièces de un cent. Combien de combinaisons de ce que l'égalité de 50 cents?
La langue que j'utilise est le C++, bien que ce n'est pas vraiment trop d'importance.
edit: C'est une programmation spécifique de la question, mais comment pourrais-je analyser une chaîne de caractères en C++ pour obtenir les valeurs de pièce? Ils ont été donnés dans un document texte comme
4 2 6 10 15 50
(où les chiffres dans ce cas correspondent à l'exemple que j'ai donné)
Avez-vous besoin de connaître la pièce de combinaisons, ou tout simplement le nombre d'entre eux?
OriginalL'auteur ahota | 2011-05-05
Vous devez vous connecter pour publier un commentaire.
Cela semble un peu comme une Partition, sauf que vous n'utilisez pas tous les entiers de 1:50. Il semble également similaire à bin packing problème avec de légères différences:
En fait, après réflexion, c'est un PAI, et donc NP-dur.
Je vous suggère de certains de programmation dynamique appyroach. Fondamentalement, vous souhaitez définir une valeur "reste" et réglez quel que soit votre objectif était de (50). Ensuite, à chaque étape, vous devrez faire les suivants:
Donc si le reste était de 50, et la plus grande de pièces d'une valeur de 25 et 10, vous feriez branche dans deux scénarios:
L'étape suivante (pour chaque branche) comme:
Chaque branche est divisée en deux branches, à moins que:
En fait, je pense que j'ai mal lu la question, il semble que l'OP veut savoir juste le de différentes façons changements qui pourraient être apportés. Dans ce cas, le DP est en effet possible et utile: pour chaque combinaison de la taille des pièces c et le montant de la modification d'une vous pouvez enregistrer le nombre de façons différentes que a peut être fait en utilisant des pièces de la taille de la plupart des c. (2D DP matrice est nécessaire pour éviter le double comptage des solutions.)
OriginalL'auteur
Ce problème est bien connu en tant que pièce de problème de change. Veuillez vérifier cette et cette pour plus de détails. Aussi, si vous Google "pièce de monnaie modifier" ou "programmation dynamique pièce de monnaie modifier", puis vous obtiendrez beaucoup d'autres ressources utiles.
OriginalL'auteur
Voici une solution récursive en Java:
OriginalL'auteur
Si vous avez 15, 10, 6 et 2 cents pièces de monnaie, et vous devez trouver combien de manières distinctes sont là pour arriver à 50, vous pouvez
Donc, fondamentalement, vous pouvez diviser le problème en problèmes plus petits (éventuellement plus petit montant et moins de pièces). Lorsque vous avez un seul type de pièce, la réponse est évidemment trivial (vous ne pouvez pas atteindre le montant prescrit exactement ou vous pouvez dans la seule voie possible).
En outre, vous pouvez également éviter de répéter le même calcul en utilisant memoization, par exemple le nombre de façons d'atteindre les 20 en utilisant uniquement [6, 2] ne dépendent pas si déjà payé 30 ont été atteint à l'aide de 15+15 ou 10+10+10, de sorte que le résultat du problème plus petit (20, [6, 2]) peut
être stockée et réutilisée.
En Python la mise en œuvre de cette idée est la suivante
OriginalL'auteur
Comme pour la deuxième partie de votre question, supposons que vous disposez de la chaîne dans le fichier
coins.txt
:Maintenant le vecteur
coins
contiendra les possibles valeurs de pièces.OriginalL'auteur
Pour un si petit nombre de pièces que vous pouvez écrire une simple force brute solution.
Quelque chose comme ceci:
Un très sales force brute solution qui imprime toutes les combinaisons possibles.
Ce est un très célèbre problème, essayez de lire à propos de les meilleures solutions d'autres, ont apporté.
OriginalL'auteur
Plutôt muet démarche est la suivante. Vous construire une cartographie de la "pièce de monnaie dont la valeur X est utilisé Y fois" et puis énumérer toutes les combinaisons possibles et sélectionner uniquement ceux dont le total est la somme désirée. Évidemment, pour chaque valeur de X que vous devez vérifier, Y allant de 0 jusqu'à la somme désirée. Ce sera plutôt lent, mais permettra de résoudre votre tâche.
OriginalL'auteur
C'est très similaire à le problème de sac-à-dos
OriginalL'auteur
En gros, vous avez à résoudre l'équation suivante: 50 = a*4 + b*6 + c*10 + d*15, où les inconnues sont a,b,c,d. Vous pouvez calculer par exemple d = (50 - a*4 - b*6 - c*10)/15 et ainsi de suite pour chaque variable. Ensuite, vous commencez à donner d toutes les valeurs possibles (vous devez commencer par celle qui a le moins de valeurs possibles, ici, d): 0,1,2,3,4 et de commencer à donner à c toutes les valeurs possibles en fonction de la valeur actuelle de d et ainsi de suite.
OriginalL'auteur
Trier la Liste à l'envers: [15 10 6 4 2]
Maintenant une solution pour 50 ct peut contenir 15 ct ou pas.
Ainsi, le nombre de solutions est le nombre de solutions pour 50 ct à l'aide de [10 6 4 2] (n'envisage plus de 15 ct pièces) plus le nombre de solutions pour 35 ct (=50ct - 15cts) à l'aide de [15 10 6 4 2]. Répétez le processus pour les deux sous-problèmes.
OriginalL'auteur
Un algorithme est une procédure pour la résolution d'un problème, il n'a pas à être dans une langue donnée.
D'abord travailler sur les entrées:
et les sorties:
Résoudre pour le cas le plus simple que vous pouvez penser d'abord:
le résultat devrait être:
Comment résoudriez-vous ci-dessus?
Comment à ce sujet:
quoi à ce sujet?
OriginalL'auteur
Solution récursive basée sur algorithmist.com des ressources de Scala:
OriginalL'auteur
Une autre version de Python:
OriginalL'auteur