背包背包递归算法:帮助调试

时间:2019-01-25 17:54:47

标签: ruby knapsack-problem

以下背包背包递归定义有什么问题?我同意它写得有些古怪(更好的版本会拆分val和权重,并在递归调用上带有索引),但是我仍然想知道为什么这个版本不起作用。我开始了一个小时,但无济于事。

C:\pentaho8.0\data-integration\kitchen /file:"C:\Users\nbessmer\Source\Professional_Services_New\Client Implementations\BlackBaud\Rapid7CodeDrop2\NexposeLoadStripped.kjb"
 "-param:HelperFiles=C:\Users\nbessmer\Source\Professional_Services\Rapid7\Output" "-param:InputDirectory=C:\Users\nbessmer\Source
\Professional_Services\Rapid7" "-param:OutputDirectory=C:\Users\nbessmer\Source\Professional_Services\Rapid7\Output\Nexpose" "-param:ReportFile=report.csv" "-param:Root=C:\Users\nbessmer\Source\Professional_Services\Rapid7" 

运行:

C:\pentaho8.0\data-integration\kitchen 
/file:"C:\Users\NBessmer\Source\Professional_Services_New\Client 
Implementations\MIS\Spoon\IP Phones\IP_Phones.kjb" 
"-param:InputDirectory=C:/Users/NBessmer/Source/Professional_Services_New/Client Implementations/MIS/Spoon/IP Phones" 
"-param:InputFile=C:/Users/NBessmer/Source/Professional_Services_New/Client Implementations/MIS/Spoon/IP Phones/IPT Devices-(Nov-29-2018).xlsx
"-param:MashupDirectory=C:/Users/NBessmer/Source/Professional_Services_New/Client Implementations/MIS/Spoon/IP Phones/mashup"
"-param:OutputDirectory=C:/Users/NBessmer/Source/Professional_Services_New/Client Implementations/MIS/Spoon/IP Phones/output"     

给我9,尽管12是更好的解决方案。

1 个答案:

答案 0 :(得分:1)

问题在于调用#shift修改了 same 数组,从而删除了一个项目。

要调试此功能,请尝试为每次items的调用打印k

一种解决方案是替换:

current_item = items.shift

使用

current_item, *remaining_items = items

,然后将所有递归调用更新为使用remaining_items


作为一个示例,它可能更清楚地说明了突变导致错误结果的原因,请考虑第一个调用:

项目[5,10]将适合背包,因此我们评估right。每次递归调用都会使items发生变异并删除一个条目。在您进入堆栈以评估任何left时,items数组为空。