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