De problèmes NP-complets problème dans XKCD

Du problème/de la bande dessinée en question: http://xkcd.com/287/

De problèmes NP-complets problème dans XKCD

Je ne suis pas sûr que c'est la meilleure façon de le faire, mais voici ce que j'ai trouvé jusqu'à présent. Je suis en utilisant CFML, mais il doit être lisible par n'importe qui.

<cffunction name="testCombo" returntype="boolean">
    <cfargument name="currentCombo" type="string" required="true" />
    <cfargument name="currentTotal" type="numeric" required="true" />
    <cfargument name="apps" type="array" required="true" />

    <cfset var a = 0 />
    <cfset var found = false />

    <cfloop from="1" to="#arrayLen(arguments.apps)#" index="a">
        <cfset arguments.currentCombo = listAppend(arguments.currentCombo, arguments.apps[a].name) />
        <cfset arguments.currentTotal = arguments.currentTotal + arguments.apps[a].cost />
        <cfif arguments.currentTotal eq 15.05>
            <!--- print current combo --->
            <cfoutput><strong>#arguments.currentCombo# = 15.05</strong></cfoutput><br />
            <cfreturn true />
        <cfelseif arguments.currentTotal gt 15.05>
            <cfoutput>#arguments.currentCombo# > 15.05 (aborting)</cfoutput><br />
            <cfreturn false />
        <cfelse>
            <!--- less than 15.05 --->
            <cfoutput>#arguments.currentCombo# < 15.05 (traversing)</cfoutput><br />
            <cfset found = testCombo(arguments.currentCombo, arguments.currentTotal, arguments.apps) />
        </cfif>
    </cfloop>
</cffunction>

<cfset mf = {name="Mixed Fruit", cost=2.15} />
<cfset ff = {name="French Fries", cost=2.75} />
<cfset ss = {name="side salad", cost=3.35} />
<cfset hw = {name="hot wings", cost=3.55} />
<cfset ms = {name="moz sticks", cost=4.20} />
<cfset sp = {name="sampler plate", cost=5.80} />
<cfset apps = [ mf, ff, ss, hw, ms, sp ] />

<cfloop from="1" to="6" index="b">
    <cfoutput>#testCombo(apps[b].name, apps[b].cost, apps)#</cfoutput>
</cfloop>

Le code ci-dessus me dit que la seule combinaison qui ajoute jusqu'à $15.05 est 7 ordres de Fruits Mélangés, et il prend 232 exécutions de mon testCombo fonction à remplir.

Est-il un meilleur algorithme pour venir à la bonne solution? Ai-je venir à la bonne solution?

  • Belle. Vous aurez probablement fermé bien que la question n'est pas 🙁
  • Il vous manque 1 échantillonneur, 2 hot wings, 1 salade de fruits.
  • Oups, accidentellement laissé la question, j'ai l'intention de demander de sortir. Je l'ai ajouté. Merci!
  • Que la langue est une abomination. Ses comme VB et XML a décidé d'avoir un bébé.
  • Hein, juste de le résoudre par la force brute. 🙂 J'ai calculer une limite supérieure d'environ 1,715 combinaisons qui doivent être examinés.
  • "Est-il un meilleur algorithme pour venir à la bonne solution?" - c'est l'une des plus grande question sans réponse dans l'informatique! Si stackoverflow arrive avec une solution générale, je vais être très impressionné 🙂
  • L'enfant bâtard de deux bâtard de childs. +1 Paul Batum.
  • Eh bien, vous pouvez dire tout simplement en regardant ce qu'il y a une meilleure solution que la force brutale - la réponse doit avoir un nombre impair de $?.?5 articles pour faire la fin total dans .05. Comment vous exprimer que dans le code en est une autre...
  • Mais le problème dans la bande-dessinée n'est pas réellement le problème de sac-à-dos. C'est un entier problème de programmation. Cependant, il est aussi à la recherche d'Une solution, pas la combinaison optimale, donc je ne sais pas si c'est vraiment NP, car il n'est en fait pas sac à dos ou IP complète.
  • Batum: Qui m'a donné un bon rire. Mes sentiments précisément.
  • Il y a une langue qui ressemble vraiment à ça? *vomit*

InformationsquelleAutor Adam Tuttle | 2008-09-26