如果现在必须将背包中的项目数限制为常数那么在动态编程情况下如何解决背包问题?这是相同的问题(最大重量,每个商品的值均为,重量),但您只能将项添加到背包,显然需要优化背包的值。
我们需要三维还是没有三维我们可以找到其他方法。我试图简单地在单元格中的背包中添加项目数,并在最后加上最大值,即项目数<=但这不是最佳解决方案。
如果现在必须将背包中的项目数限制为常数那么在动态编程情况下如何解决背包问题?这是相同的问题(最大重量,每个商品的值均为,重量),但您只能将项添加到背包,显然需要优化背包的值。
我们需要三维还是没有三维我们可以找到其他方法。我试图简单地在单元格中的背包中添加项目数,并在最后加上最大值,即项目数<=但这不是最佳解决方案。
Answers:
非常好的问题!
您是对的两次:
在下面,我假设您熟悉基于动态编程的解决方案。特别是,我不会讨论如何向后遍历表以确定解决方案。
让我们首先关注典型情况:项目数量不受限制。在这种情况下,您只需要构建一个表,其中当背包的总容量等于并且仅考虑前项时,包含最佳值。从这里:牛逼我,Ĵ我Ĵ
其中和代表第个项目的权重和值。如果是背包的总容量,并且总共有物品,则最佳解由。已知该算法在伪多项式时间内运行,其优点之一是它仅考虑适合最大容量的那些组合。
但是,在添加约束时,这还不够:最大项数。原因是先前的重复公式未考虑项目的不同组合:
因此第一个解决方案包括添加第三维。对于您的情况,让是背包的容量为时的最佳解决方案,仅考虑前项目,并且不允许在背包中放入个以上的项目。现在,
第一个表达应该清楚。由于表格第层是第二项,因此按上述要求跟踪了第项中项的最佳组合。
该算法的有效实现不需要为所有计算。请注意,前面的递归关系将层与关联,因此可以在两个连续层之间进行交替(例如,如果您对的最优解感兴趣,则只需使用两个连续层即可:0和1、1和2、2和3、3和4,您就完成了)。换句话说,该算法占用了基于动态编程的传统方法所需内存的两倍,因此仍可以在伪多项式时间内运行。
但是请注意,这不是唯一的解决方案!还有另一个您可能会发现更优雅。在前面的公式中,我们检索了由第一个中不超过项构成的最优解,即。但是,应该清楚的是仅使用原始表,它就等于!即,也可以通过考虑1个,2个,3个...的最优解来检索不超过项的最优解。项...为了使这种公式化起作用,您还应该跟踪每个部分解决方案中考虑的项数,以便每个像元需要两个整数。该存储器占用导致与上述算法完全相同的存储器需求(使用层形式的三维)。
希望这可以帮助,