Comment résoudre récursivement l'algorithme du sac à dos «classique»?
C'est ma tâche
Le Problème de sac-à-Dos est un classique de la science de l'ordinateur. Dans sa forme la plus simple
forme il faut essayer pour s'adapter à des éléments d'un poids différent dans un
sac à dos de sorte que le sac à dos se termine avec un certain poids total.
Vous n'avez pas besoin pour s'adapter à tous les articles. Par exemple, supposons que vous souhaitez
votre sac à dos de peser exactement 20 livres, et vous avez cinq éléments,
avec un poids de 11, 8, 7, 6, et 5 livres. Pour un petit nombre d'éléments,
les humains sont assez bon à la résolution de ce problème par l'inspection. Si vous
pouvez probablement comprendre que seuls les 8, 7, et 5 la combinaison d'éléments
ajoute jusqu'à 20.
Je ne sais vraiment pas par où commencer l'écriture de cet algorithme. Je comprends la récursivité lorsqu'il est appliqué à des factorielles et le triangle des nombres. Cependant, je suis perdu maintenant.
source d'informationauteur lampShade | 2011-10-15
Vous devez vous connecter pour publier un commentaire.
Qu'avez-vous essayer?
L'idée, compte tenu du problème que vous avez dit (qui précise que nous devons utiliser la récursivité) est simple: pour chaque élément que vous pouvez prendre, voir si c'est mieux de le prendre ou non. Donc, il n'existe que deux chemins possibles:
Quand vous prenez l'article, vous le supprimez de votre liste et vous diminuez la capacité par le poids de l'objet.
Lorsque vous ne prenez pas le point, vous supprimez la si vous de la liste, mais vous ne diminuez pas la capacité.
Parfois, il contribue à l'impression de ce que les appels récursifs peut ressembler. Dans ce cas, il pourrait ressembler à ceci:
Je l'ai fait sur le but de montrer l'appel à [8 7 6 5] avec une capacité de 20, ce qui donne un résultat de 20 (8 + 7 + 5).
Remarque que [8 7 6 5] est appelée deux fois: une fois avec une capacité de 20 (parce que nous n'avons pas pris 11) et une fois avec une capacité de 9 (parce que ne prendre 11).
De sorte que le chemin d'accès à la solution:
11 pas prises, l'appel à [8 7 6 5] avec une capacité de 20
8 prises, appelant [7 6 5] avec une capacité de 12 (20 - 8)
7 prises, appelant [6 5] avec une capacité de 5 (12 - 7)
6 pas prises, l'appel à [5] avec une capacité de 5
5 prises, nous sommes à zéro.
La méthode en Java peut s'adapter en très peu de lignes de code.
Puisque c'est évidemment des devoirs, je vais vous aider avec un squelette:
J'ai fait copier le tableau une nouvelle matrice, ce qui est moins efficace (mais de toute façon la récursivité n'est pas la voie à suivre ici si vous chercher de la performance), mais en plus "fonctionnelle".
J'ai dû le faire pour mes devoirs donc j'ai testé tous les codes ci-dessus (sauf pour le Python), mais aucun d'eux ne fonctionne pour tous les cas de coin.
C'est mon code, cela fonctionne pour tous les cas de coin.
Il n'est pas optimisé, la récurrence de vous tuer, mais vous pouvez utiliser de simples memoization pour résoudre ce problème. Pourquoi mon code court, de rectification et simple à comprendre? Je viens de vérifier la définition mathématique de la sac à Dos 0-1 problème http://en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming