0-1背包: 即每种物品只有2 种选择,分别为:装入背包或不装入背包,物品数和背包容量已给定,计算装入背包物品的最大价值和最优装入方案,用回溯法搜索子集树的算法进行求解。对此模型我们刚好建立二叉树( 此处为完全二叉树)。对应的叶子节点数为: n! (n为顶点数)。
解子集树:
约束函数: cw+w[i]*x[i]<=c。(cw:当前背包重量; w[i]*x[i]选中背包重量; c:背包容量)
深度探索截止条件:i>n。(i:当前节点; n:节点总数)
子集树结构:
思想: 对于每个物品若符合约束函数将当前节点加入到活动节点中 ,继续深度探索。若不符合直接将当前节点以及子树"剪枝"处理。当深度探索到叶子节点时。记录下此时背包最优值和对应的物品选择情况。然后从当前叶子节点往上回溯,重复刚才的回溯方法 。注意: 回溯要回溯到根。再由根探索树的另一边子树。当所有节点路径回溯完即可解决问题。
回溯方法代码:
void backpack