本程序是用Java开发的使用回溯法解决01背包问题。程序比较易懂输入分三行,第一行是物品数量N和背包容量C第二行是物品重量数组,第三行是价值重量数组然后输出朂优解。
该程序用C++实现是对简单的回溯法解决01背包问题的改进,通过加一个剪枝函数condition 可大大减少递归的次数达到较大程度提高效率的目的。
给定n种物品(每种物品仅有一件)和一个背包物品i的重量是wi ,其价值为pi 背包的容量为w。问应如何选择物品装入背包使得装入背包中的物品的总价值最大?
要想得到朂优解就要在效益增长和背包容量消耗两者之间寻找平衡。也就是说总应该把那些单位效益最高的物体先放入背包。
背包问题可看做昰一种回溯:
因此可用回溯方法解决。
回溯方法解决背包问题:
//与之前的物品相比 有无冲突 //无冲突添加至解路径 // 如果是最后一行 成功找到一个解 //如果不是最后一行 则判断i+1行 //第i+1行存在合适位置或 不更新与还原相关变量, 而是根据已知信息推导相关变量值
//根据已知 推倒相关參数值 //与之前的物品相比 有无冲突 //无冲突添加至解路径 // 如果是最后一行 成功找到一个解 //如果不是最后一行 则判断i+1行 //第i+1行存在合适位置
// 判斷节点(I,j)是否为解路径上的节点,其中: // i表示解路径上的第i个测试节点、j表示该节点的某个候选值 更新相关参数值(假定选择了此候选值j,因此更新受影响的参数值); 与0—(i-1) 层进行判断看是否与以遍历的节点有冲突 若是最后一层,则成功找到一条解路径返回TRUE; 若不是最後一层,则判断第i+1层是否有正确的节点 |