所以我遇到的问题如下:有一组N类对象,每个类别都有M个对象,每个对象都有一个指定的值和权重。我们必须从每个类别中选择一个对象,使得权重<=某个给定容量W,并且该值是最大值。必须使用分支和边界方法来解决任务。我很难理解这种方法在这种情况下应该如何工作。你能解释一下吗?
答案 0 :(得分:1)
算法应该做的一个简短例子。
假设您有4个项目[(weight, value)]= [(3, 5),(8, 10),(1, 2),(4, 5)]
。
首先按重量对它们进行排序= [(1, 2),(12, 20),(4, 5),(9, 10)]
最大重量是16.
从第一个项目开始创建一个树,您可以在其中添加广告或删除项目。 在树中的每个级别计算权重,值和仍然留在三个中的值。如果分支中的值+值+小于您找到的最大值,则关闭该分支。如果重量超过大声,您也会关闭分支。
下面是它应该如何工作的示意图。
(value) (0)
(weight) (0)
(value left) (37)
add drop
(1,2) <------- ------>
(2) (0)
(1) (0)
(35) (35)
(20,12) ---------------------------------------------------------------
(22) (2) (20) (0)
(13) (1) (12) (0)
(15) *(15) (15) *(15)
(4,5) -----------------------------------------------------------------------
(27) (22) (25) (20)
(17) (13) (16) (12)
**(10) (10) (10) (10)
(9,10) ---------------------------------------------------------------------------
(31) (20) (35) (25) (30) (20)
(22) (13) (25) (16) (21) (12)
**(0) (0) **(0) (0) **(0) (0)
win
*
分支由于剩余的值+值而关闭。那么树中的最大值
**
由于重量大于大声重量,分支被关闭。
与蛮力方法相比,此方法的好处是减少了计算量。通过启动每个权重具有最高值的项目,很可能快速关闭分支并减少计算时间。
希望这有助于