蛮力法动态规划法回溯法和分支限界法求解01背包问题.docx
- 文档编号:23490623
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:19
- 大小:19.26KB
蛮力法动态规划法回溯法和分支限界法求解01背包问题.docx
《蛮力法动态规划法回溯法和分支限界法求解01背包问题.docx》由会员分享,可在线阅读,更多相关《蛮力法动态规划法回溯法和分支限界法求解01背包问题.docx(19页珍藏版)》请在冰豆网上搜索。
蛮力法动态规划法回溯法和分支限界法求解01背包问题
一、实验内容:
分别用蛮力法、动态规划法、回溯法和分支限界法求解0/1背包问题。
注:
0/1背包问题:
给定n种物品和一个容量为C的背包,物品i的重量是w
i,其价值为v
i,背包问题是如何使选择装入背包内的物品,使得装入背包中的物品的总价值最大。
其中,每种物品只有全部装入背包或不装入背包两种选择。
二、所用算法的基本思想及复杂度分析:
1.蛮力法求解0/1背包问题:
1)基本思想:
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。
在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。
2)代码:
#include
#include
usingnamespacestd;
#defineN100//最多可能物体数
structgoods//物品结构体
{
intsign;//物品序号
intw;//物品重量
intp;//物品价值
}a[N];
boolm(goodsa,goodsb)
{
return(a.p/a.w)>(b.p/b.w);
}
intmax(inta,intb)
{
returna
b:
a;
}
intn,C,bestP=0,cp=0,cw=0;
intX[N],cx[N];
/*蛮力法求解0/1背包问题*/
intForce(inti)
{
if(i>n-1){
if(bestP for(intk=0;k } returnbestP; } cw=cw+a[i].w; cp=cp+a[i].p; cx[i]=1;//装入背包 Force(i+1); cw=cw-a[i].w; cp=cp-a[i].p; cx[i]=0;//不装入背包 Force(i+1); returnbestP; } intKnapSack1(intn,goodsa[],intC,intx[]) { Force(0); returnbestP; } intmain() { goodsb[N]; printf("物品种数n: "); scanf("%d",&n);//输入物品种数 printf("背包容量C: "); scanf("%d",&C);//输入背包容量 for(inti=0;i printf("物品%d的重量w[%d]及其价值v[%d]: ",i+1,i+1,i+1); scanf("%d%d",&a[i].w,&a[i].p); b[i]=a[i]; } intsum1=KnapSack1(n,a,C,X);//调用蛮力法求0/1背包问题printf("蛮力法求解0/1背包问题: \nX=["); for(i=0;i cout< printf("]装入总价值%d\n",sum1); bestP=0,cp=0,cw=0;//恢复初始化 } 3)复杂度分析: 蛮力法求解0/1背包问题的时间复杂度为: T(n)=O(2n)。 2.动态规划法求解0/1背包问题: 1)基本思想: 令V(i,j)表示在前i(1£i£n)个物品中能够装入容量为j(1£j£C)的背包中的物品的最大值,则可以得到如下动态函数: V(i,0)=V(0,j)=0 ìV(i-1,j)(j i) V(i,j)= í {} maxV(i-1,j),V(i-1,j-w)+v(j³w)iiiî 按照下述方法来划分阶段: 第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n个阶段。 最后,V(n,C)便是在容量为C的背包中装入n个物品时取得的最大价值。 2)代码: #include #include usingnamespacestd; #defineN100//最多可能物体数 structgoods//物品结构体 { intsign;//物品序号 intw;//物品重量 intp;//物品价值 }a[N]; boolm(goodsa,goodsb) { return(a.p/a.w)>(b.p/b.w); } intmax(inta,intb) { returna b: a; } intn,C,bestP=0,cp=0,cw=0; intX[N],cx[N]; intKnapSack2(intn,goodsa[],intC,intx[]) { intV[N][10*N]; for(inti=0;i<=n;i++)//初始化第0列 V[i][0]=0; for(intj=0;j<=C;j++)//初始化第0行 V[0][j]=0; for(i=1;i<=n;i++)//计算第i行,进行第i次迭代 for(j=1;j<=C;j++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蛮力法 动态 规划 回溯 分支 限界 求解 01 背包 问题