所以我遇到的问题是:有一组 N 个类别的对象,每个类别中有 M 个对象,每个对象都有一个指定的值和权重。我们必须从每个类别中选择一个对象,以便权重 <= 某个给定的容量 W,并且值是最大值。该任务必须使用分支和边界方法来解决。我很难理解这种方法在这种情况下应该如何工作。你能给我解释一下吗?
问问题
539 次
1 回答
1
算法应该做什么的简短示例。
假设您有 4 个项目 [(weight, value)]= [(3, 5),(8, 10),(1, 2),(4, 5)]
。首先按重量对它们进行排序 = [(1, 2),(12, 20),(4, 5),(9, 10)]
,最大重量为 16。
从第一个项目开始制作一棵树,您可以在其中广告或删除项目。在树中的每一层计算权重、值和仍然留在三者中的值。如果分支中的值 left + value 小于您找到的最大值,则关闭该分支。如果重量超过大声,您也可以关闭分支。
下面是它应该如何工作的示意图。
(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
*
分支是关闭的,因为左值 + 值 < 然后是树中的最大值
**
由于重量大于大声重量,分支被关闭。
与蛮力方法相比,这种方法的好处是减少了计算量。通过启动每个重量值最高的项目,您很可能会快速关闭分支并减少计算时间。
希望这会有所帮助
于 2017-11-07T08:27:09.543 回答