- 1、本文档共76页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法第3章资料
* 2.递归关系 设所给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作出决策之后,问题 处于两种状态之一: 背包剩余容量是j,没产生任何效益; 剩余容量j-wi,效益值增长了vi . 从n推至i+1,i算出最优值m(i,j) ( i=n,…,1) 。 m(1,c)为最优值。 然后用回溯法Traceback找出最优解xi 其中i,c为整值。 3.算法复杂度分析: 从m(i,j)的递归式容易看出,算法Knapsack需要O(nc)计算时间; Traceback需O(n)计算时间 ;算法总体需要O(nc)计算时间。当背包容量c很大时,算法需要的计算时间较多。例如,当c2n时,算法需要Ω(n2n)计算时间。 * 4.算法描述 template class Type void Knapsack( Type *v, int *w, int c, int n, Type **m) { int jMax = min(w[n]-1, c) //背包剩余容量// for (int j = 0; j=jMax; j++) //背包不同剩余容量j ? jMaxc// m[n][j]=0; for(int j=w[n]; j=c; j++) //背包不同剩余容量j c// m[n][j]=v[n]; for(int i=n-1; i1; i--) { jMax=min(w[i]-1, c); for(int j=0; j=jMax; j++) //背包不同剩余容量j ? jMaxc// m[i][j]=m[i+1][j]; //没产生任何效益// for(int j=w[i]; j=c; j++) //背包不同剩余容量j-wi c// m[i][j]=max(m[i+1][j], m[i+1][j-w[i]]+v[i]); //效益值增长vi // } 背包问题的动态规划算法Knapsack如下: * 4.算法描述 m[1][c]=m[2][c]; if(c=w[1]) m[1][c]=max(m[1][c], m[2][c-w[1]]+v[1]); } Template class Type //求最优解xi // void Traceback(Type **m, int w, int c, int n, int x) { for(int i=1; in; i++) if(m[i][c]==m[i+1][c]) x[i]=0; else { x[i]=1; c= c- w[i]; } x[n]=(m[n][c])?1:0; } 说明:当wi为正整数时,用二维数组m[][]来存储m(i,j)相应的最优值。 Knapsack算法的另一缺点是要求所给物品的重量wi(1 ? i ? n) 是整数 * 5.改进算法 为克服以上缺点,引入阶梯函数。利用序偶概念,改进算法的计算时间复杂性为O(2n )。而当所给物品的重量wi是整数时,其计算时间复杂性为 (略) 。 * 由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的i(1≤i≤n),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃点是这一类函数的描述特征。在一般情况下,函数m(i,j)由其全部跳跃点惟一确定。如图所示。 对每一个确定的i(1≤i≤n),用一个表p[i]存储函数m(i,j)的全部跳跃点。表p[i]可依计算m(i,j)的递归式递归地由表p[i+1]计算,初始时p[n+1]={(0,0)}。 * 典型例子(一) n=3,c=6,w={4,3,2},v={5,2,1}。 x (0,0) m(4,x) x (2,1) m(4,x-2)+1 x (0,0) (2,1) m(3,x) (3,2) x m(3,x-3)+2 (5,3) x (0,0) (2,1) m(2,x) (3,2) (5,3) x m(2,x-4)+5 (4,5) (6,6) (7,7) (9,8) x (0, 0) (2,
文档评论(0)