Les problèmes de sac à dos sont facilement résolus par une programmation dynamique. La programmation dynamique s'exécute en temps polynomial; c'est pourquoi nous le faisons, non?
J'ai lu qu'il s'agit en réalité d'un problème NP-complet, ce qui voudrait dire que résoudre le problème en problème polynomial est probablement impossible.
Où est mon erreur?
Réponses:
Knapsack problème estNP-complete lorsque les nombres sont donnés à titre binaires des nombres. Dans ce cas, la programmation dynamique prendra de manière exponentielle de nombreuses étapes (taille de l’entrée, c’est-à-dire le nombre de bits de l’entrée) pour terminer † .
Par contre, si les nombres de l’entrée sont donnés de manière unaire, la programmation dynamique fonctionnera en temps polynomial (à la taille de l’entrée).
Ce type de problèmes s’appelle faiblementNP-complete .
Ce type d’algorithme, c’est-à-dire polynomial dans le plus grand nombre qui fait partie de l’entrée, mais exponentiel dans la longueur en entrée, est appelé pseudo-polynôme .
la source
m
(taille du paquet) etn
(nombre d'éléments) est totalement inconnue, non? Et re "quand les nombres sont donnés sous forme de nombres binaires" ... mais ne pouvez-vous pas le dire pour quoi que ce soit? Avec la plupart des algorithmes, nous parlons de taille d’entrée en base 10. Pourquoi parler de binaire ici? Et que vous encodiez en binaire, octal, décimal, etc., leactual
nombre d'itérations que vous parcourez dans votre boucle principale de l'algorithme dépend directement de lan
et de laW
.La principale confusion réside dans la différence entre " taille " et " valeur ".
" Temps polynomial " implique un polynôme par rapport à la taille de l'entrée.
" Temps pseudopolynomial " implique un polynôme par rapport à la valeur de l'entrée. On peut montrer (ci-dessous) que cela équivaut à être exponentiel par rapport à la taille de l'entrée.
la source
Il existe cependant différentes variantes (par exemple, 0-1 Knapsack et autres ) qui peuvent ou non avoir des solutions polynomiales ou de bonnes approximations. Mais ce n'est pas la même chose que le problème général de Knapsack. En outre, il peut exister des algorithmes efficaces fonctionnant pour des instances spécifiques (familles d' instances ) , mais ces algorithmes prendront plus de temps sur d'autres instances.
la source