[汇总]蛮力法、动态规划法、回溯法和分支限界法求解01背包问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[汇总]蛮力法、动态规划法、回溯法和分支限界法求解01

背包问题

一、实验内容:

分别用蛮力法、动态规划法、回溯法和分支限界法求解0/1背包问题。

C注:0/1背包问题:给定种物品和一个容量为的背包,物品的重量ni

是,其价值为,背包问题是如何使选择装入背包内的物品,使得装入背wvii 包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。

二、所用算法的基本思想及复杂度分析:

1.蛮力法求解0/1背包问题:

1)基本思想:

对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。 2)代码:

#include

#include

using namespace std;

#define N 100 //最多可能物体数 struct goods //物品结构体

{

int sign; //物品序号

int w; //物品重量

int p; //物品价值

}a[N];

bool m(goods a,goods b)

{

return (a.p/a.w)>(b.p/b.w); }

int max(int a,int b)

{

return a

}

int n,C,bestP=0,cp=0,cw=0;

int X[N],cx[N];

/*蛮力法求解0/1背包问题*/

int Force(int i)

{

if(i>n-1){

if(bestP

for (int k=0;k

}

return bestP;

}

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);

return bestP;

}

int KnapSack1(int n,goods a[],int C,int x[]) { Force(0);

return bestP;

}

int main()

{

goods b[N];

printf("物品种数n: ");

scanf("%d",&n); //输入物品种数

printf("背包容量C: ");

scanf("%d",&C); //输入背包容量

for (int i=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];

}

int sum1=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)复杂度分析:

n蛮力法求解0/1背包问题的时间复杂度为:。T(n),O(2)

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,w),i V(i,j),,,,VijVijwvjwmax(,1,),(,1,,),(,)iii, 按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在

各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第个n C阶段。最后,便是在容量为的背包中装入个物品时取得的最nV(n,C) 大价值。

2)代码:

#include

#include

using namespace std;

#define N 100 //最多可能物体数

struct goods //物品结构体

{

int sign; //物品序号

int w; //物品重量

int p; //物品价值

}a[N];

bool m(goods a,goods b)

{

return (a.p/a.w)>(b.p/b.w);

}

int max(int a,int b)

{

return a

}

int n,C,bestP=0,cp=0,cw=0;

int X[N],cx[N];

int KnapSack2(int n,goods a[],int C,int x[]) {

int V[N][10*N];

for(int i=0;i<=n;i++) //初始化第0列

V[i][0]=0;

for(int j=0;j<=C;j++) //初始化第0行

V[0][j]=0;

相关文档
最新文档