1、0-1 背包问题0-1 背包问题的解空间可用子集树表示在搜索解空间树时,只要其左儿子结点是一个可行结点搜索进入其左子树当右子树中有可能包含最优解进入右子树搜索否则将右子树减去r当前剩余物品价值总和cp当前价值bestp当前最优价值当 cp+rbestp 时,可减去右子树计算右子树中解的上界的更好的方法 将剩余物品依其单位价值排序 依次装入物品,直至装不下时 再装入该物品的一部分而装满背包 由此得到的价值右子树中解的上界0-1 背包问题的一个实例已知:n=4c=7p=9 10 7 4w=3 5 2 1解: 这四个物品的单位价值分别3 2 3.5 4 以物品单位重量价值的递减序装入物品 先装物品
2、4 装入物品 3 和物品 1 装入这 3 个物品后,剩余的背包容量为 17-(3+2+1)只能装入 0.21/5的物品 2 得到一个解x=1 0.2 1 1相应的价值为 221*9+0.2*10+1*7+1*4 这不是一个可行解,但其价值是最优值的上界算法分析: Bound 计算当前结点处的上界 Knap 的数据成员记录解空间树中的结点信息以减少参数传递及递归调用所需的栈空间 在解空间树的当前扩展结点处,仅当要进入右子树时才计算上界 Bound,以判断是否可将右子树减去 进入左子树时不需计算上界,因为其上界与其父结点的上界相同核心代码:tempclass Knapfriend Typep Kn
3、apsack(Typep*,Typew*,Typew,int);private:Typep Bound(int i);Void Backtrack(int i);Typew* w;Typep* p;Typew cw;Typep cp;Typep bestp;Tempvoid Knap:Backtrack(int i)if(in)bestp=cp;return;if(cw+wiTypep Knap:Bound(int i)/ 计算上界Typew cleft = c - cw; / 剩余容量Typep b = cp;/ 以物品单位重量价值递减序装入物品while (i = n b += pi;i+;/ 装满背包if (i = n) b += pi/wi * cleft;return b;