0/1背包在C ++中使用Branch and Bound
想法是实现以下事实:贪婪方法为分数阶背包问题提供了最佳解决方案。
为了检查特定节点是否可以为我们提供更好的解决方案,我们计算(通过节点)实施贪婪方法的最佳解决方案。如果用Greedy方法计算出的解本身不是迄今为止最好的解,那么我们将无法通过该节点获得更好的解。
完整的算法如下-
根据每单位重量的值比率的降序对所有项目进行排序,以便可以使用贪婪方法计算上限。
初始化最大利润,例如maxProfit=0
创建一个空队列Q。
创建决策树的虚拟节点并将其插入或排队到Q。虚拟节点的利润和权重为0。
当Q不为空或为空时,请执行以下操作。
Q中的项目已创建。让提取的项目为u。
计算下一级节点的利润。如果利润高于maxProfit,则修改maxProfit。
计算下一级节点的边界。如果bound大于maxProfit,则将下一级节点添加到Q。
请看以下情况:未将下一级节点视为解决方案的一部分或将其视为解决方案的一部分,并添加一个节点作为下一级来排队,但权重和收益却没有处理或考虑下一级节点。
插图如下-
输入值
// First thing in every pair is treated as weight of item
//第二件事被视为项目的值
Item arr1[] = {{2, 40}, {3.14, 50}, {1.98, 100},
{5, 95}, {3, 30}};
Knapsack Capacity W1 = 10输出结果
The maximum possible profit = 235
热门推荐
10 孙媳妇祝福语简短
11 小孩想说的祝福语简短
12 宝宝祝福语诗意简短 古文
13 新婚红包祝福语简短男
14 18岁的祝福语简短
15 古风祝福语唯美简短亲情
16 新婚祝福语简短十六字
17 给男生的简短祝福语
18 送给情侣贺卡祝福语简短