【发布时间】:2010-09-13 14:18:01
【问题描述】:
有问题的问题/漫画:http://xkcd.com/287/
我不确定这是不是最好的方法,但这是我迄今为止想出的。我正在使用 CFML,但它应该是任何人都可以阅读的。
<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>
上面的代码告诉我,加起来 15.05 美元的唯一组合是 7 份混合水果,我的 testCombo 函数需要执行 232 次才能完成。
是否有更好的算法来得出正确的解决方案?我找到了正确的解决方案吗?
【问题讨论】:
-
您缺少 1 个采样器、2 个热翅、1 个混合水果。
-
这种语言令人憎恶。就像VB和XML一样决定生孩子。
-
“有没有更好的算法来得出正确的解决方案?” - 这是计算机科学中最大的未解决问题之一!如果stackoverflow提出了一个通用的解决方案,我会印象深刻的:)
-
两个混蛋的混蛋。 +1 保罗巴图姆。
-
@Paul Batum:这让我很开心。正是我的感受。
标签: language-agnostic np-complete