0-1 à Dos algorithme
Est la suivante sac à Dos 0-1 problème résoluble:
- 'float' valeurs positives et
- 'float' poids (qui peut être positif ou négatif)
- "flotter", la capacité du sac-à-dos > 0
J'ai en moyenne < 10 articles, donc je suis en train de penser à l'aide d'une force brute de la mise en œuvre. Cependant, je me demandais si il ya une meilleure façon de le faire.
Avez-vous vraiment dire possible ou résoluble efficacement?
Si vous n'avez pas besoin d'une réponse exacte, vous devriez regarder dans le recuit simulé..
2^10 est de 1024. Certainement la force brute, même si il ya une "meilleure façon", il sera presque certainement beaucoup plus lent.
Alors, quelle est la différence entre les "valeurs positives" et le "poids"? Qu'est-ce que vous essayez de frapper?
Chaque élément a une valeur et un poids. Nous voulons maximiser la somme des valeurs telles que la somme des poids est <= sac-à-dos de la capacité.
Si vous n'avez pas besoin d'une réponse exacte, vous devriez regarder dans le recuit simulé..
2^10 est de 1024. Certainement la force brute, même si il ya une "meilleure façon", il sera presque certainement beaucoup plus lent.
Alors, quelle est la différence entre les "valeurs positives" et le "poids"? Qu'est-ce que vous essayez de frapper?
Chaque élément a une valeur et un poids. Nous voulons maximiser la somme des valeurs telles que la somme des poids est <= sac-à-dos de la capacité.
OriginalL'auteur alhazen | 2011-11-14
Vous devez vous connecter pour publier un commentaire.
C'est relativement simple, binaire du programme.
Je vous suggère de force brute avec la taille. Si à tout moment vous dépasser le poids maximal, vous n'avez pas besoin de chercher des combinaisons d'éléments supplémentaires, vous pouvez vous débarrasser de la totalité de l'arbre.
Oh, attendez, vous avez négative poids? Inclure tous les poids est négatif toujours, puis procéder comme ci-dessus pour le bon poids. Ou faire le poids négatif articles ont aussi valeur négative?
Inclure tous les poids négatif éléments à valeur positive. Exclure tous les éléments positifs de poids et de valeur négative.
Pour poids négatif des éléments dont la valeur est négative, soustraire leur poids (en augmentant le sac à dos capavity) et l'utilisation d'un pseudo-élément qui représente pas prendre l'élément en question. Le pseudo-élément positif de poids et de valeur. Procéder par la force brute avec la taille.
Merci beaucoup pour cette! Comment la modification de l'algorithme si une contrainte supplémentaire doit être remplie: limiter la sélection de jusqu'à 5 objets sur le nombre total d'éléments ? Merci encore.
Vérifier de nouveau, il n'y a pas de soustraction. L'état de la valeur est restauré à partir de la pile d'appel (l'appelant a une copie non modifiée).
c'est juste un deuxième type de "poids". Ajouter un
currentCount
paramètre et uncountLimit
champ.J'ai donc mis à jour mon code, et maintenant c'est la résolution de cette version du sac à dos. Et je suis "mieux" les valeurs que vous, c'est à dire que je suis à côté des choses de la hausse des valeurs dans mon sac que vous êtes, quand nous sommes en cours d'exécution sur le même jeu. Peut-être que je suis en train de faire quelque chose de mal? Peut-être que vous êtes? Regarde la mienne sur. Il devrait être assez simple. La vôtre prendra les déconstruire afin de s'assurer qu'il couvre tous les chemins.
OriginalL'auteur Ben Voigt
Ouais, la force brute. C'est un problème NP-Complet de problème, mais cela ne devrait pas d'importance parce que vous aurez moins de 10 points. Force Brute ne sera pas problématique.
Merci pour cela. Mais je pense que votre code renvoie la première combinaison valide qui satisfait les contraintes, plutôt que celui dont la valeur totale est la plus grande possible (et les contraintes satisfait bien sûr).
Auriez-vous la gentillesse de perf-tester ma solution récursive, puisque vous avez déjà le framework de test?
Ce code ne permettent pas de résoudre le problème de sac-à-dos, j'ai peur: -1. Aussi il est à la fois plus simple et plus rapide d'utiliser les opérations bit à bit de la génération d'un chiffre binaire de la chaîne. En C, vous pouvez simplement remplacer
if (splitOut[j] == '1')
avecif ((i >> j) & 1)
, je suis sûr que la syntaxe est similaire en C#.nouveau code utilise le nouveau binaire de masquage.
OriginalL'auteur McKay
Si vous ne pouvez avoir que des valeurs positives, alors chaque élément avec un poids négatif doit aller dans.
Alors je pense que l'on peut calculer la Valeur/proportion en Poids, et de la force brute le reste des combinaisons en fonction de cet ordre, une fois que vous obtenez celui qui vous convient, vous pouvez ignorer le reste.
Le problème peut être que le classement et le tri est fait, plus cher que juste faire tous les calculs.
Il y aura évidemment un autre point d'équilibre en fonction de la taille et de la distribution de l'ensemble.
OriginalL'auteur Jodrell
OriginalL'auteur Arvind Telharkar
OriginalL'auteur Mehul Birari