1、一、实验内容:分别用蛮力法、动态规划法、回溯法和分支限界法求解 0/1 背包问题。注:0/1 背包问题:给定 种物品和一个容量为 的背包,物品 的重nCi量是 ,其价值为 ,背包问题是如何使选择装入背包内的物品,使得装iwiv入背包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。二、所用算法的基本思想及复杂度分析:1.蛮力法求解 0/1 背包问题:1)基本思想:对于有 n 种可选物品的 0/1 背包问题,其解空间由长度为 n 的 0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入
2、总价值,然后记录遍历过的最大价值。2)代码:#include#includeusing namespace std;#define N 100 /最多可能物体数struct goods /物品结构体int sign; /物品序号int w; /物品重量int p; /物品价值aN;bool m(goods a,goods b)return (a.p/a.w)(b.p/b.w);int max(int a,int b)return an-1)if(bestP#includeusing namespace std;#define N 100 /最多可能物体数struct goods /物品结构体i
3、nt sign; /物品序号int w; /物品重量int p; /物品价值aN;bool m(goods a,goods b)return (a.p/a.w)(b.p/b.w);int max(int a,int b)return a0;i-)if (VijVi-1j)xi-1=1;j=j-ai-1.w;else xi-1=0;return VnC; /返回背包取得的最大价值int main()goods bN;printf(“物品种数 n: “);scanf(“%d“, /输入物品种数printf(“背包容量 C: “);scanf(“%d“, /输入背包容量for (int i=0;i#
4、includeusing namespace std;#define N 100 /最多可能物体数struct goods /物品结构体int sign; /物品序号int w; /物品重量int p; /物品价值aN;bool m(goods a,goods b)return (a.p/a.w)(b.p/b.w);int max(int a,int b)return an-1)if(bestP#includeusing namespace std;#define N 100 /最多可能物体数struct goods /物品结构体int sign; /物品序号int w; /物品重量int p
5、; /物品价值aN;bool m(goods a,goods b)return (a.p/a.w)(b.p/b.w);int max(int a,int b)return aHi/2.b)swap(Hi, Hi/2);elsedone = true;i = i/2;/堆中元素下移void mov_down(HEAP H, int n, int i)bool done = false;if(2*i) Hi.b)i+;if(Hi/2.b=x.b)mov_up(H,i);elsemov_down(H, n, i);/获得堆顶元素并删除HEAP del_top(HEAP H, int del(H, n
6、, 1);return x;/计算分支节点的上界void bound( KNAPNODE* node, int M, goods a, int n)int i = node-k;float w = node-w;float p = node-p;if(node-wM) / 物体重量超过背包载重量node-b = 0; / 上界置为 0elsewhile(w+ai.wb = p + (M - w)*ai.p/ai.w;elsenode - b = p;/用分支限界法实现 0/1 背包问题int KnapSack4(int n,goods a,int C, int X)int i, k = 0;
7、/ 堆中元素个数的计数器初始化为 0int v;KNAPNODE *xnode, *ynode, *znode;HEAP x, y, z, *heap;heap = new HEAPn*n; / 分配堆的存储空间for( i=0; is1i = false;xnode-k = xnode-w = xnode-p = 0;while(xnode-ks1ynode-k = true; / 装入第 k 个物体ynode-w += aynode-k.w; / 背包中物体重量累计ynode-p += aynode-k.p; / 背包中物体价值累计ynode-k +; / 搜索深度+bound(ynode, C, a, n); / 计算结点 y 的上界y.b = ynode-b;y.p = ynode;insert(heap, y, k); /结点 y 按上界的值插入堆中znode = new KNAPNODE; / 建立结点 z*znode = *xnode; /结点 x 的数据复制到结点 zznode-k+; / 搜索深度+bound(znode, C, a, n); /计算节点 z 的上界z.b = znode-b;z.p = znode;insert(heap, z, k); /结点 z 按上界的值插入堆中delete xnode;