我发现在动态规划解决01背包问题时,每个例子中都存在物品的重量(成本)和收益,但从未明确提到需要对物品列表进行排序。然而,在所有这些例子中,它们都按照重量和收益递增的顺序进行排序(在这些例子中,重量越大,利润越高)。因此,我的问题是:当将物品从物品数组/列表添加到矩阵中时,我是否可以以任何顺序添加它们?或者我应该先添加最小重量或者最小利润的物品?因为从多个例子中找不到明确答案,我不确定是巧合还是每次添加最小重量/利润的物品。
我发现在动态规划解决01背包问题时,每个例子中都存在物品的重量(成本)和收益,但从未明确提到需要对物品列表进行排序。然而,在所有这些例子中,它们都按照重量和收益递增的顺序进行排序(在这些例子中,重量越大,利润越高)。因此,我的问题是:当将物品从物品数组/列表添加到矩阵中时,我是否可以以任何顺序添加它们?或者我应该先添加最小重量或者最小利润的物品?因为从多个例子中找不到明确答案,我不确定是巧合还是每次添加最小重量/利润的物品。
我猜,在某些类型的背包问题中可能需要排序。例如,考虑问题"出租车最大收益"。在这里,输入必须按乘客起点排序,否则我们将无法获得最佳结果。
例如,考虑上述问题的以下输入:- 9 [[2,3,1],[2,9,2], [3,6,7],[2,3,6]]
如果您在递归方法中应用典型的背包实现,而不对输入进行排序,则无法获得最佳解决方案。
可以通过一些随机洗牌实验找到答案。 我发现是:按升序排列更好。如果我错了,请纠正我。
要点:https://gist.github.com/whille/39cf7bf8cf5dcf6ac933063735ae54de
问题描述在《算法设计》(ISBN:9780321295354)第6.4章中。 有两种方法:
functools.cache
可用于检查需要多少子计算,如我的代码所示: test_random()
的升序是currsize中最小的,因此它最有效,并且可以扩展到浮点值。10个随机权重(1〜100)和200个背包的结果:
[(13.527716157276256, 18.371888775465692), (16.18632175987168, 206.88043031085252), (20.14117982372607, 81.52793937986635), (33.28606671929836, 298.8676699147799), (49.12968642850187, 22.037638580809592), (55.279973594800225, 377.3715225559507), (56.56103181962746, 460.9161412820592), (60.38456825749498, 10.721915577913244), (67.98836121062645, 63.47478755362385), (86.49436333909377, 208.06767811169286)]: reverse: False CacheInfo(hits=0, misses=832, maxsize=None, currsize=832) [(86.49436333909377, 208.06767811169286), (67.98836121062645, 63.47478755362385), (60.38456825749498, 10.721915577913244), (56.56103181962746, 460.9161412820592), (55.279973594800225, 377.3715225559507), (49.12968642850187, 22.037638580809592), (33.28606671929836, 298.8676699147799), (20.14117982372607, 81.52793937986635), (16.18632175987168, 206.88043031085252), (13.527716157276256, 18.371888775465692)]: reverse: True CacheInfo(hits=0, misses=1120, maxsize=None, currsize=1120)method2 注意事项: