0019算法笔记——【动态规划】0-1背包问题教程范本.docx

0019算法笔记——【动态规划】0-1背包问题教程范本.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0019算法笔记——【动态规划】0-1背包问题?????1、问题描述:???? 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大????? 形式化描述:给定c 0, wi 0, vi 0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ? ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。???????2、最优性原理:???? 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解:???? 证明:使用反证法。若不然,设(z2,z3,…,zn)是上述子问题的一个最优解,而(y2,y3,…,yn)不是它的最优解。显然有??????????????????????????????????? ∑vizi? ∑viyi?? (i=2,…,n)???? 且?????????????????????????? w1y1+ ∑wizi= c???? 因此?????????????????????? v1y1+ ∑vizi?(i=2,…,n) ∑ viyi, (i=1,…,n)????? 说明(y1,z2, z3,…,zn)是(3.4.1)0-1背包问题的一个更优解,导出(y1,y2,…,yn)不是背包问题的最优解,矛盾。???????3、递推关系:????设所给0-1背包问题的子问题????????? 的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式:???? 注:(3.4.3)式此时背包容量为j,可选择物品为i。此时在对xi作出决策之后,问题处于两种状态之一:??? (1)背包剩余容量是j,没产生任何效益;??? (2)剩余容量j-wi,效益值增长了vi?;?????算法具体代码如下:[cpp]?view plain?copy//3d10-1?动态规划?背包问题??#include?stdafx.h??#include?iostream???using?namespace?std;?????const?int?N?=?4;????void?Knapsack(int?v[],int?w[],int?c,int?n,int?m[][10]);??void?Traceback(int?m[][10],int?w[],int?c,int?n,int?x[]);????int?main()??{??????int?c=8;??????int?v[]={0,2,1,4,3},w[]={0,1,4,2,3};//下标从1开始??????int?x[N+1];??????int?m[10][10];????????cout待装物品重量分别为:endl;??????for(int?i=1;?i=N;?i++)??????{??????????coutw[i]?;??????}??????coutendl;????????cout待装物品价值分别为:endl;??????for(int?i=1;?i=N;?i++)??????{??????????coutv[i]?;??????}??????coutendl;????????Knapsack(v,w,c,N,m);????????cout背包能装的最大价值为:m[1][c]endl;????????Traceback(m,w,c,N,x);??????cout背包装下的物品编号为:endl;??????for(int?i=1;?i=N;?i++)??????{??????????if(x[i]==1)??????????{??????????????couti?;??????????}??????}??????coutendl;????????return?0;??}????void?Knapsack(int?v[],int?w[],int?c,int?n,int?m[][10])??{??????int?jMax?=?min(w[n]-1,c);//背包剩余容量上限?范围[0~w[n]-1]??????for(int?j=0;?j=jMax;j++)??????{??????????m[n][j]=0;??????}????????for(int?j=w[n];?j=c;?j++)//限制范围[w[n]~c]??????{??????????m[n][j]?=?v[n];??????}????????for(int?i=n-1;?i1;?i--)??????{??????????jMax?=

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档