0/1背包问题:有n个重量分别为w1、w2、…、wn的物品(物品编号为1~n),他们的价值分别为v1、v2、…、vn,给定义给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。求出所有的物品组合,对于每一种组合,计算其总重量sumw和总价值sumv,当sumw小于等于W时该组合是一种解,并通过比较将最佳方案保存到maxsumw和maxsumv中,最后输出最佳解。
用回溯法求解:用x[1..n]数组存放最优解,x[i]=1表示第i个物品放入背包中,x[i]=0表示第i个物品不放入背包中。由于每个物品要么装入,要么不装入,其解空间是一颗子集数,树中每个节点表示背包的一种选择状态,记录当前放入背包的物品总重量和总价值,每个分支节点下面由两边表示对物品是否放入背包的两种可能的选择。对第i层上的某个分支节点,对应的状态为dfs(i,tw,tv,op),其中tw表示装入背包中的物品总重量,tv表示背包中物品总价值,op记录一个解向量。该状态的两种扩展如下:
[if !supportLists](1) [endif]选择第i个物品放入背包:op[i]=1,tw=tw+w[i],tv=tv+v[i],转向下一个状态des(i+1,tw,tv,op)。该决策对应左分支。
[if !supportLists](2) [endif]不选择第i个物品放入背包:op[i]=0,tw不变,tv不变,转向下一个状态dfs(i+1,tw,tv,op)。该决策对应右分支。
对所有叶子结点进行比较求出满足tw=W的最大价值maxv,对应的最优解op存放到x中。