基于Visual C++的0-1背包问题的动态规划算法

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:yizhonglishi
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:0-1背包问题是经典的NP问题。本文对0-1背包问题的动态规划算法进行了分析,用Visual C++实现该算法。
  关键词:0-1背包;动态规划
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31378-02
  The Dynamic Programming Algorithms of 0-1 Knapsack Problem Based on Visual C++
  CHEN Zi-li, PAN Yan-yan
  (Fujian Communication Technology College,Fuzhou 350007,China)
  Abstract:The 0-1knapsack problem is a classic NP problem.In this paper,the 0-1 knapsack problem and its algorithm is analyzd ,the algorithms is based on Dynamic Programming.And carry out that algorithms in the Visual C++.
  Key words:0-1 Knapsack;Dynamic Programming
  
  1 0-1背包问题
  
  0-1背包问题是:已知n个物品的重量及其价值分别为Wi>0和Pi>0,背包的容量假设设为Ci>0,如何选择哪些物品装入背包可以使得在背包的容量约束限制之内所装物品的价值最大?
  
  2 几种解法的比较
  
  2.1 动态规划算法
  动态规划可以把困难得多阶段决策变换为一系列相互联系比较容易的单阶段问题。对于背包问题可以对子过程用枚举法求解,而且约束条件越多,决策的搜索范围越小,求解也越容易。
  2.2 回溯法
  回溯法需要为问题定义一个解空间,这个解空间必须至少包含问题的一个解(可能是最优的)。使用递归回溯法解决背包问题的优点在于它算法思想简单, 而且它能完全遍历搜索空间,肯定能找到问题的最优解;但是由于此问题解的总组合数有2n个,因此,随着物件数 n 的增大,其解的空间将以2n级增长,当 n 大到一定程度上,用此算法解决背包问题将是不现实的。
  2.3 贪心算法
  使用贪心方法求解时计算的复杂度降低了很多。贪心算法是一种不要求最优解,只希望得到较为满意解的方法。一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心方法常以当前情况为基础作最优选择,而不是考虑各种可能的整体情况,所以贪心算法不需要回溯。但是,对于某些情况,实际上有解,而该算法不能找到解。
  2.4 分枝-限界法
  分枝界限是另一种系统地搜索解空间的方法,与回溯法的主要区别在于对E节点的扩充方式。每个活节点有且仅有一次会变成E节点。当一个节点变为E节点是,则生成从该节点移动一步即可到达的所有新节点。在生产的节点中,抛弃那些不可能导出可行解的节点,其余节点加入到活节点表,然后从表中选择一个节点作为下一个E节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充才结束。
  2.5 遗传算法
  遗传算法是一类借鉴生物自然选择和自然遗传机制的随机化的搜索算法。它适用于处理传统搜索方法难于解决的复杂和非线性问题。遗传算法是一种群体型操作,该操作以群体中所有个体为对象。选择、交叉和变异是遗传算法的三个主要算子,它们构成了遗传算法的主要操作。使用遗传算法解决物件数较大的背包问题,它具有收敛快、搜索速度快的特点。然而在一般情况下,使用基本遗传算法解决背包问题时,得到问题的近似解也不能满足逼近最优解的要求。
  下面介绍用动态规划算法实现0-1背包问题的求解。
  
  3 动态规划算法
  
  3.1 0-1背包问题的描述
  3.2 最优子结构性质
  0-1背包问题具有最优子结构性质。设(y1,y2,…,yn)是所给0-1背包问题的一个最优解。则
  3.3 递归关系
  设所给0-1背包问题的子问题:
  的最优解值为m(i.j),即m(i.j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,就可以建立计算m(i.j)的递归式如下:
  
  4 C++实现算法
  
  #include
  #include
  #include
  int min(int w,int c)
  {int temp;
  if (w  else
  temp=c;
  return temp;}
  int max(int w,int c)
  {int temp;
  if (w>c)temp=w;
  else temp=c;
  return temp;}
  void knapsack(int v[],int w[],int c,int ,int**m)
  //求最优值
  {int jmax=min(w[n]-1,c);
  for(int j=0;j<=jmax;j++)
  m[n][j]=0;
  for(int jj=w[n];jj<=c;jj++)
  m[n][jj]=v[n];
  for(int i=n-1;i>1;i--){ //递归部分
  jmax=min(w[i]-1,c);
  for(int j=0;j<=jmax;j++)
  m[i][j]=m[i+1][j];
  for(int jj=w[i];jj<=c;jj++)
  m[i][jj]=max(m[i+1][jj],m[i+1][jj-w[i]]+v[i]);}
  m[1][c]=m[2][c];
  if(c>=w[1])
  m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
  cout<<"最优值:"<  for(int l=2;l<=n;l++)
  for(int j=0;j<=c;j++)
  {cout<  cout<  int traceback(int **m,int w[],int c,int n,int x[])
  //回代,求最优解
  {cout<<"得到的一组最优解如下:"<  for(int i=1;i  if(m[i][c]==m[i+1][c]) x[i]=0;
  else {x[i]=1;
  c-=w[i];}
  x[n]=(m[n][c])?1:0;
  for(int y=1;y<=n;y++)
  {cout<  return x[n];}
  void main(){
  int n,c;
  int**m;
  cout<<"请输入物品个数和重量上限:";
  cin>>n>>c;
  int *v=new int[n+1];
  cout<<"Pls input the property (v[i]):"<  for(int i=1;i<=n;i++)
  cin>>v[i];
  int *w=new int[n+1];
  cout<<"Pls input the weight (w[i]):"<  for(int j=1;j<=n;j++)
  cin>>w[j];
  int *x=new int[n+1];
  m=new int*[n+1];//动态的分配二维数组
  for(int p=0;p  m[p]=new int[c+1];}
  knapsack(v,w,c,n,m);
  traceback(m,w,c,n,x);}
  
  5 测试
  
  在Visual C++ 下对该算法进行测试 :例:背包的容量c=10,物品个数n=5,w={2,2,6,5,4},
  v={6,3,5,4,6}。
  输出结果: 1 1 0 0 1
  背包的总重量:8
  背包的总价值:15
  
  6 算法分析
  
  上述算法Knapsack需要O (nc)计算时间,traceback需要O(n)计算时间。采用动态规划算法解决0-1背包问题,并通过编程在Visual C++下进行测试得到了较好的结果,证明了算法的正确性。但是,算法还是有缺陷的,当c很大时,算法需要计算的时间较多,还需改进。
  
  参考文献:
  [1]王晓东.计算机算法设计与分析[M].北京:电子工业出版社,2004.
  [2]刘玉娟,王相海.0-1背包2问题的两种扩展形式及其解法[J].计算机应用研究,2006.
  [3]杨晓红.基于Visual C++的0-1背包问题的贪婪算法[J].科技资讯导报,2007.
  [4]黄波,蔡之华.0/1背包问题及其解法研究[J].电脑知识与技术,2007.
  [5]杨甲明.基于遗传算法的0-1背包问题的求解[D].石家庄经济学院,2006.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
摘要:多态性是面向对象的重要特性之一,Java中的多态体现在类的继承和实现接口等方面。本文就JAVA语言支持的多态性作了深入全面的探讨,在此基础上,结合例子说明了多态性在程序设计中的应用。  关键词:Java语言;多态性; 类;接口  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2007)17-31349-01  An Study on Java’s Dynamic Pol
期刊
摘要:短信技术除了在人们日常的信息交流外,还可以在企业生产管理中得到广泛的应用。本文就SMGP协议、SP接入技术以及它们在电信业务支撑系统中的实现方法做详细说明。  关键词:短信技术;SP;SPMS;SMGP协议  中图分类号:TP393文献标识码:A 文章编号:1009-3044(2007)17-31277-03  The Application of PHS SMS SP Access Tec
期刊
摘要:Java语言凭借跨平台、面相对象、功能强大等优点,已经成为现在最流行的语言之一。在J2EE web项目中,有一种常见的应用被称作作业调度的应用。文中对作业调度的应用背景进行了归纳总结,并结合实例对作业调度的实现步骤进行了介绍,有助于读者从整体上快速掌握作业调度的概念和实现。同时只要对实例进行简单的修改就可以进行实际应用,具有较强的适用价值。  关键词:作业调度;Quartz;Java邮件服务
期刊
摘要:为了解决高校等机构学位论文的查询问题,运用ASP技术及SQL SERVER数据库技术,设计并开发了基于B/S结构的高校学位论文检索系统。所开发的系统运行稳定,功能齐全,很好的满足了学位论文的查询需求,为学术文献的充分利用提供了有力支撑。  关键词:学位论文检索;ASP技术;SQL Server;B/S模式  中图分类号:TP392:J642.477文献标识码:A 文章编号:1009-3044
期刊
摘要:本文介绍了一种基于ARM7TDMI处理器的数据采集模块的实现方法。该模块可以对电压、电流、热电阻、热电偶、开关量等多种物理量进行测量。ARM处理器与数据采集模块之间采用模拟SPI协议进行数据传输。为了实现高精度,采用了24位A/D。经过对电路的多次改进,该模块目前已能测准到万分之一的精度,优于现在的工业标准。  关键词:ARM;多通道;高精度;数据采集  中图法分类号: TP806文献标识码
期刊
摘要:Excel是微软的办公自动化软件的一个组件,是用于数据处理的电子表格软件,而ADO是访问和操作数据库的方法。通过一个课程信息管理程序的设计对于在Delphi中如何利用ADO组件来访问Excel文件的技术方法与实现步骤进行了详细阐述。  关键字:ADO;Excel;访问  中图法分类号:TP311文献标识码:B文章编号:1009-3044(2007)17-31332-02  Visits th
期刊
摘要:XML正成为Internet上数据描述和交换的主要标准,因此对面向对象XML存储研究变的很重要。通过扩展DTD的支持使得XML文档具有面向对象的特性,通过对扩展DTD的解析,从而获取XML模式信息,这些信息不仅支持查询语言和XML文档的有效性检查,而且支持新存储模式建立。如何有效的获取这些信息成为研究重点。  关键字:JavaCC;JJTree;扩展DTD;解析  中图分类号:TP391文献
期刊
摘要:实验室管理工作的主要内容包括设备、教学任务、实验项目、规章制度等。由于采用人工管理,管理信息量大、操作繁琐,设备的利用率很难提高,所以建设实验室管理信息系统就势在必行。本文主要探讨了系统开发的目标,可行性分析,以及系统的总体设计,包括概念模型的分析与数据库的开发。  关键词:实验室系统;可行性;数据库  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-313
期刊
摘要:文中分析了企业应用系统集成的必要性和点对点集成及EAI方法的不足。探讨了面向服务的架构模型及其集成思想。提出了基于SOA的企业应用系统集成的解决方案,并给出了一个具体应用集成的开发示例。充分论证了基于SOA的应用系统集成开发的优越性和必然性。Web服务技术是实现SOA的最佳实践。  关键词:面向服务的架构;服务;Web服务;EAI  中图分类号:TP311文献标识码:A 文章编号:1009-
期刊
摘要:介绍了在VC++.net的运行环境下运用拆分窗口功能实现界面切换的步骤及具体实现方法,并给出了关键的实现函数与事例。  关键词:VC++.net;界面切换;拆分窗口  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31382-01  Realizing of Changing Interface to Use the Function of Separat
期刊