蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc

上传人:sk****8 文档编号:3121395 上传时间:2019-05-22 格式:DOC 页数:12 大小:122.50KB
下载 相关 举报
蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc_第1页
第1页 / 共12页
蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc_第2页
第2页 / 共12页
蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc_第3页
第3页 / 共12页
蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc_第4页
第4页 / 共12页
蛮力法、动态规划法、回溯法和分支限界法求解01背包问题.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。