回溯法求0-1背包问题学习资料.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯法求 0-1 背包问 题 《算法设计与分析》实验报告 学号: 姓名: 日期: 得分: 、实验内容: 用回溯法求解0/1背包问题 注:给定n种物品和一个容量为C的背包,物品i的重量是Wi ,其价值 为Vi,背包问题是如何使选择装入背包内的物品,使得装入背包中的物品 的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选 择。 、所用算法的基本思想及复杂度分析: 1.回溯法求解背包问题: 1) 基本思想: 回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断 地利用限界函数(bounding function) 来处死那些实际上不可能产生所 需解的活结点,以减少问题的计算量。这种具有限界函数的深度优先生 成法称为回溯法。 对于有n种可选物品的0/1背包问题,其解空间由长度为 n的0-1 向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是 一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就 进入右子树搜索。 2)复杂度分析: 回溯法求解0/1背包问题的时间复杂度为:T(n) O(2n)。 空间复杂度:有n个物品,即最多递归n层,存储物品信息就是 个一维数组,即回溯法求解0/1 个一维数组,即回溯法求解 0/1背包问题的空间复杂度为0(n)。 2.以动态规划法验证: 1)基本思想: 令V(i, j) 令V(i, j)表示在前i(1 i n)个物品中能够装入容量为j(1 j C) 的背包中的物品的最大值,则可以得到如下动态函数: 的背包中的物品的最大值, 则可以得到如下动态函数: V(i,0) V(0,j) 0 V(i,j) V(i 1,j)(j Wi) maxV(i 1, j),V(i 1, j wj v, (j wj 2个物按照下述方法来划分阶段:第一阶段,只装入前 1 2个物 各种情况下的背包能够得到的最大价值;第二阶段,只装入前 品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第 n个阶段。最后,V(n,C)便是在容量为C的背包中装入n个物品时取得 的最大价值。 2)复杂度分析: 动态规划法求解0/1背包问题的时间复杂度为:T(n) O(n C)。 三、源程序及注释: #in cludeiostream #i ncludealgorithm using n amespace std; struct goods //物品结构体 { int sign; //物品序号 int w; //物品重量 intv; //物品价值 }a[100]; bool m(goods a,goods b) { return (a.v/a.w)(b.v/b.w); } int max(i nt a,i nt b) { retur n ab?b:a; } int n,C,bestP=0,cp=0,cw=0; int x[100],cx[100]; //回溯法函数 int BackTrack(i nt i) { if(i n-1){ if(bestPcp){ x[k]=cx[k];//存储最优路径 x[k]=cx[k];//存储最优路径 bestP=cp; } return bestP; } if(cw+a[i].w=C){ // 进入左子树 cw=cw+a[i].w; cp=cp+a[i].v; cx[a[i].sign]=1; // 装入背包 BackTrack(i+1); cw=cw_a[i].w; cp=cp-a[i].v; //回溯,进入右子树 } cx[a[i].sign]=0; // 不装入背包 BackTrack(i+1); return bestP; } //回溯法求解0/1背包问题 int Kn apSack(i nt n, goods a[],i nt C,i nt x[]) { for(int i=0;in;i++) { x[i]=0; a[i].sig n=i; } sort(a,a+n,m);〃将各物品按单位重量价值降序排列 BackTrack(O); return bestP; } //动态规划法求解0/1背包问题 int Knap Sack1(i nt n,goods a[],i nt C,i nt x[]) { int V[100][1000]; for(int i=0;i=n;i++) // 初始化第 0 列 V[i][0]=0; //初始化第0 //初始化第0行 //计算第i行,进行第i次迭代 V[0][j]=0; for(i=1;i=n ;i++) for(j=1;j=C;j++) if(ja[i-1].w) V[i][j]=V[i-1][j]; else V[i][j]=max(V[i-1][j],V[i-1][j-a[i-1].w]+a[i-1].v); j=

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档