欢迎来到天天文库
浏览记录
ID:28064132
大小:83.33 KB
页数:6页
时间:2018-12-07
《回溯法求0-1背包问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、学号:曰期:《算法设计与分析》实验报告姓名:得分:—一、实验内容:用回溯法求解0/1背包问题注:给定N种物品和一个容量为C的背包,物品Z的重量是%,其价值为vf,背包问题是如何使选择装入背包内的物品,使得装入背包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。二、所用算法的基本思想及复杂度分析:1.回溯法求解背包问题:1)基本思想:回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(boundingfunction)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。这种具有限
2、界函数的深度优先生成法称为回溯法。对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。2)复杂度分析:回溯法求解0/1背包问题的时间复杂度为:7/0=O(2n)。空间复杂度:有n个物品,即最多递归层,存储物品信息就是一个一维数组,即回溯法求解0/1背包问题的空间复杂度为0(/1)。2.以动态规划法验证:1)基本思想:令v(/,y)表示在前/(KKn)个物品中能够装入容量为yd3、的背包中的物品的最大值,则可以得到如下动态函数:V(/,0)=V(0,y)=0“JImax{V(z-1,7),V(z-l,7-vv,.)+vi}(j>按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n个阶段。最后,V(n,C)便是在容量为C的背包中装入A2个物品时取得的最大价值。2)复杂度分析:动态规划法求解0/1背包问题的时间复杂度为:?(/?)=O(zixC)o三、源程序及注释:#incIude4、strearn〉#incIudeusingnamespacestd;structgoods//物品结构体{intsign;//物品序号intw;//物品重量intv;//物品价值}a[100];booIm(goodsa,goodsb){return(a.v/a.w)>(b.v/b.w);}intmax(inta,intb){returnan-1){if5、(bestP6、ck(intn,goodsa口,intC,intx[]){for(inti二0;i7、进行第i次迭代V[O][j]:O;for(i=1;i<=n;i++)for(j=1;j<=C;j++)if(j8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
3、的背包中的物品的最大值,则可以得到如下动态函数:V(/,0)=V(0,y)=0“JImax{V(z-1,7),V(z-l,7-vv,.)+vi}(j>按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n个阶段。最后,V(n,C)便是在容量为C的背包中装入A2个物品时取得的最大价值。2)复杂度分析:动态规划法求解0/1背包问题的时间复杂度为:?(/?)=O(zixC)o三、源程序及注释:#incIude4、strearn〉#incIudeusingnamespacestd;structgoods//物品结构体{intsign;//物品序号intw;//物品重量intv;//物品价值}a[100];booIm(goodsa,goodsb){return(a.v/a.w)>(b.v/b.w);}intmax(inta,intb){returnan-1){if5、(bestP6、ck(intn,goodsa口,intC,intx[]){for(inti二0;i7、进行第i次迭代V[O][j]:O;for(i=1;i<=n;i++)for(j=1;j<=C;j++)if(j8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
4、strearn〉#incIudeusingnamespacestd;structgoods//物品结构体{intsign;//物品序号intw;//物品重量intv;//物品价值}a[100];booIm(goodsa,goodsb){return(a.v/a.w)>(b.v/b.w);}intmax(inta,intb){returnan-1){if
5、(bestP6、ck(intn,goodsa口,intC,intx[]){for(inti二0;i7、进行第i次迭代V[O][j]:O;for(i=1;i<=n;i++)for(j=1;j<=C;j++)if(j8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
6、ck(intn,goodsa口,intC,intx[]){for(inti二0;i7、进行第i次迭代V[O][j]:O;for(i=1;i<=n;i++)for(j=1;j<=C;j++)if(j8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
7、进行第i次迭代V[O][j]:O;for(i=1;i<=n;i++)for(j=1;j<=C;j++)if(j8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
8、ain()printf("物品种数n:");scanf("%d",&n);//输入物品种数printf("背包容量C:");scanf(n%dn,&C);//输入背包容量for(inti=0;i
此文档下载收益归作者所有