El problema/cómic en cuestión: http://xkcd.com/287/Resolver el problema NP-completo en xkcd
No estoy seguro de que esta es la mejor manera de hacerlo, pero esto es lo que he llegado con tan lejos. Estoy usando CFML, pero debería ser legible por cualquiera.
<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>
El código anterior me dice que la única combinación que se suma a $ 15.05 es de 7 órdenes de fruta mezclada, y se tarda 232 ejecuciones de mi función testCombo para completar.
¿Hay algún algoritmo mejor para llegar a la solución correcta? ¿He llegado a la solución correcta?
Hermosa. Sin embargo, probablemente lo cierren, ya que no es una pregunta :( – Meff
Faltan 1 muestra, 2 alas calientes, 1 fruta mixta. – Randy
Vaya, accidentalmente dejé la pregunta que tenía la intención de hacer. Lo he agregado. Gracias ! –