蛮力法、动态规划法、回溯法和分支限界法求解01背包问题
一、实验内容:
分别用蛮力法、动态规划法、回溯法和分支限界法求解0/1背包问题。
注:0/1背包问题:给定n种物品和一个容量为C的背包,物品i的重量
是wi,其价值为vi,背包问题是如何使选择装入背包内的物品,使得装入背
包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包
两种选择。
二、所用算法的基本思想及复杂度分析:
1.蛮力法求解0/1背包问题:
1)基本思想:
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1
向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每
一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得
到的装入总价值,然后记录遍历过的最大价值。
2)代码:
#include<iostream>
#include<algorithm>
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<b?b: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<cp&&cw+a[i].w<=C){
for (int k=0;k<n;k++) X[k]=cx[k];//存储最优路径
bestP=cp;
}
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<n;i++) //输入物品i的重量w及其价值v
{
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<n;i++)
cout<<X[i]<<" ";//输出所求X[n]矩阵
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 wi) V(i,j) V(i 1,j),V(i 1,j wi) vi (j wi) max
按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在
各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,
确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n个
阶段。最后,V(n,C)便是在容量为C的背包中装入n个物品时取得的最
大价值。
2)代码:
#include<iostream>
#include<algorithm>
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<b?b: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++) V[i][0]=0; for(int j=0;j<=C;j++) V[0][j]=0; for(i=1;i<=n;i++) for(j=1;j<=C;j++) //初始化第0列 //初始化第0行 //计算第i行,进行第i次迭代
if(j<a[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].p); j=C; //求装入背包的物品 for (i=n;i>0;i--) { if (V[i][j]>V[i-1][j]){ x[i-1]=1; j=j-a[i-1].w; x[i-1]=0; } else } return V[n][C]; //返回背包取得的最大价值
}
int main()
{
goods b[N];
printf("物品种数n: ");
scanf("%d",&n); //输入物品种数 printf("背包容量C: "); scanf("%d",&C); //输入背包容量 for (int i=0;i<n;i++) //输入物品i的重量w及其价值v { 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 sum2=KnapSack2(n,a,C,X);//调用动态规划法求0/1背包问题
printf("动态规划法求解0/1背包问题:\nX=[ ");
for(i=0;i<n;i++) cout<<X[i]<<" ";//输出所求X[n]矩阵 printf("] 装入总价值%d\n",sum2); for (i=0;i<n;i++) { a[i]=b[i]; }//恢复a[N]顺序
}
3)复杂度分析:
动态规划法求解0/1背包问题的时间复杂度为:T(n) O(n C)。
3.回溯法求解0/1背包问题:
1)基本思想:
回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断
地利用限界函数(bounding function)来处死那些实际上不可能产生所
需解的活结点,以减少问题的计算量。这种具有限界函数的深度优先生
成法称为回溯法。
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1
向量组成,可用子集数表示。在搜索解空间树时,只要其左儿子结点是一
个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进
入右子树搜索。
2)代码:
#include<iostream>
#include<algorithm>
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<b?b:a;
}
int n,C,bestP=0,cp=0,cw=0;
int X[N],cx[N];< …… 此处隐藏:2952字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节




