Algorithme pour trouver les numéros à partir d'une liste de taille n somme vers un autre numéro
J'ai un nombre décimal (appelons objectif) et une variété d'autres nombres décimaux (appelons le tableau éléments) et j'ai besoin de trouver toutes les combinaisons de numéros de éléments qui somme au but.
J'ai une préférence pour une solution en C# (.Net 2.0), mais que le meilleur algorithme de gagner quel que soit.
Votre signature de la méthode pourrait ressembler à quelque chose comme:
public decimal[][] Solve(decimal goal, decimal[] elements)
OriginalL'auteur Sam Meldrum | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Des réponses intéressantes. Merci pour les liens vers wikipedia, s'ils sont intéressants: ils ne sont pas réellement résoudre le problème comme l'a déclaré que j'étais à la recherche de correspondances exactes - plus d'une comptabilité /livre blancing problème qu'une traditionnelle bin-packing /sac à dos de problème.
J'ai suivi le développement de débordement de pile avec intérêt et je me demandais s'il serait utile. Ce problème est venu au travail et je me demandais si un débordement de pile peut fournir un prêt à une réponse (ou une meilleure réponse) plus rapidement que je ne l'écrire moi-même. Merci aussi pour les commentaires suggérant cet être étiqueté devoirs, je pense que c'est assez exact, à la lumière de ce qui précède.
Pour ceux qui sont intéressés, voici ma solution qui utilise la récursivité (naturellement) j'ai aussi changé mon esprit à propos de la signature de la méthode, et est allé pour une Liste> plutôt que decimal[][] comme type de retour:
Si vous voulez une application pour tester cela fonctionne, essayez cette console le code de l'application:
J'espère que cela aide quelqu'un d'autre obtenir une réponse plus rapidement (que ce soit pour les devoirs ou autre).
Acclamations...
C'est une solution récursive. Je serais intéressé de voir votre solution c'est 1/3 de la longueur. Peut-être que vous devriez réellement exemple, la solution avant de commenter?
Les correspondances exactes sont la correspondance la plus proche. Si la correspondance la plus proche n'est pas l'expression exacte, il n'y a pas de correspondance exacte.
"ils ne sont pas réellement résoudre le problème comme indiqué"? La wikipédia liens sont tout à fait pertinentes. Horowitz et Sahni est l'approche à prendre.
Je sais que c'est ~il y a 2 ans, mais est-il une chance que vous pourriez écrire votre premier morceau de code dans un pseudo-code? J'ai actuellement ne savons Python et j'ai vraiment ne peut pas lire C#. J'ai essayé de mon mieux à la réécriture en Python mais je ne comprends pas certains de la syntaxe et mon code me donner une liste vide 😛
OriginalL'auteur Sam Meldrum
Le sous-ensemble-somme problème, et un peu plus en général problème de sac-à-dos, sont résolus avec la programmation dynamique: brute-force énumération de toutes les combinaisons n'est pas nécessaire. Consulter Wikipedia ou de votre favori des algorithmes de référence.
Bien que les problèmes sont NP-complets, ils sont très "facile" NP-complet. La complexité algorithmique dans le nombre d'éléments est faible.
OriginalL'auteur Steve Jessop
Je pense que vous avez une bin packing problème sur vos mains (ce qui est NP-dur), donc je pense que la seule solution va être d'essayer toutes les combinaisons possibles jusqu'à ce que vous trouver un qui fonctionne.
Edit: Comme l'a fait remarquer dans un commentaire, vous n'aurez pas toujours devez essayer chaque combinaison pour chaque série de chiffres que vous venez à travers. Cependant, n'importe quelle méthode que vous venez avec a scénario de la pire éventualité ensembles de nombres, où vous sera devez essayer chaque combinaison -- ou au moins un sous-ensemble de combinaisons qui croît de manière exponentielle avec la taille de l'ensemble.
Sinon, il ne serait pas un problème NP-difficile.
OriginalL'auteur Rob Dickerson
Vous avez décrit une problème de sac-à-dos, la seule véritable solution est de la force brute. Il y a un certain rapprochement des solutions qui sont plus rapides, mais ils ne peuvent pas s'adapter à vos besoins.
OriginalL'auteur ARKBAN
Alors que pas de résoudre le problème de la force brutale (comme déjà mentionné) vous pouvez trier vos numéros d'abord, puis allez sur la liste de gauche (car une fois que vous avez passé la Somme de la valeur, vous ne pouvez pas ajouter n'importe quel nombre plus grand que le But de la Somme).
Cela va changer la façon dont vous mettez en œuvre votre algorithme (dans l'ordre de tri seule fois, puis passez les éléments marqués), mais dans la moyenne, une amélioration des performances.
OriginalL'auteur Adi
OriginalL'auteur guest