回溯法求0-1背包问题.doc

回溯法求0-1背包问题.doc

ID:56703306

大小:106.50 KB

页数:5页

时间:2020-07-05

回溯法求0-1背包问题.doc_第1页
回溯法求0-1背包问题.doc_第2页
回溯法求0-1背包问题.doc_第3页
回溯法求0-1背包问题.doc_第4页
回溯法求0-1背包问题.doc_第5页
资源描述:

《回溯法求0-1背包问题.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、《算法设计与分析》实验报告学号:姓名:日期:得分:一、实验内容:用回溯法求解0/1背包问题注:给定种物品和一个容量为的背包,物品的重量是,其价值为,背包问题是如何使选择装入背包内的物品,使得装入背包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。二、所用算法的基本思想及复杂度分析:1.回溯法求解背包问题:1)基本思想:回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(boundingfunction)来处死那些实际上不可能产生所需解的活结点,以减少问

2、题的计算量。这种具有限界函数的深度优先生成法称为回溯法。对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。2)复杂度分析:回溯法求解0/1背包问题的时间复杂度为:。空间复杂度:有个物品,即最多递归层,存储物品信息就是一个一维数组,即回溯法求解0/1背包问题的空间复杂度为。2.以动态规划法验证:1)基本思想:令表示在前个物品中能够装入容量为的背包中的物

3、品的最大值,则可以得到如下动态函数:按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第个阶段。最后,便是在容量为的背包中装入个物品时取得的最大价值。2)复杂度分析:动态规划法求解0/1背包问题的时间复杂度为:。三、源程序及注释:#include#includeusingnamespacestd;structgoods//物品结构体

4、{intsign;//物品序号intw;//物品重量intv;//物品价值}a[100];boolm(goodsa,goodsb){return(a.v/a.w)>(b.v/b.w);}intmax(inta,intb){returnan-1){if(bestP

5、最优路径bestP=cp;}returnbestP;}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);returnbestP;}//回溯法求解0/1背包问题intKnapSack(intn,goodsa[],intC,intx[

6、]){for(inti=0;i

7、i=1;i<=n;i++)//计算第i行,进行第i次迭代for(j=1;j<=C;j++)if(j0;i--){if(V[i][j]>V[i-1][j]){x[i-1]=1;j=j-a[i-1].w;}elsex[i-1]=0;}returnV[n][C];//返回背包取得的最大价值}//

8、测试以上算法的主函数intmain(){printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf("%d",&C);//输入背包容量for(inti=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。