算法7_动态规划法学案.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
template class T T KnapsackT::f(int j, float X) //私有递归函数 { //物品0-j放入载重X的背包中的最大收益 if (j0) return( (x0)? -INFTY: 0); if (Xw[j]) return f(j-1,X); //只有一种选择——不取物品j else { T a=f(j-1,X); T b=f(j-1,X-w[j])+p[j]; //两种选择——取或不取物品j if (ab) return a; else return b; //取其中较大的一种选择 } } template class T T KnapsackT::RKnap() //公有函数 { if (n0) return f(n-1,m); else return NoAns; //一个代表无收益的常量 } 例7-8 有0/1背包问题n=3,(w0,w1,w2)=(2,3,4),(p0,p1,p2)=(1,2,4),M=6,求最优解值f(2,6)。 递归求解过程: f(2,6)=max{f(1,6),f(1,6-4)+4}= f(1,6)=max{f(0,6),f(0,6-3)+2}= f(1,2)=f(0,2)= f(0,6)=max{f(-1,6),f(-1,6-2)+1}= f(0,3)=max{f(-1,3),f(-1,3-2)+1}= f(0,2)=max{f(-1,2),f(-1,2-2)+1}= 1 1 1 1 3 5 ∵ f(-1,y)=0 ,y≥0 程序7-8 递归算法实现 template class T T KnapsackT::f(int j, float X) { //物品0-j放入载重X的背包中的最大收益 if (j0) return( (x0)? -INFTY: 0); if (Xw[j]) return f(j-1,X); //只有一种选择——不取物品j else { T a=f(j-1,X); T b=f(j-1,X-w[j])+p[j]; //两种选择——取或不取物品j if (ab) return a; else return b; //取其中较大的一种选择 } } 物品数目为n时,程序的递归算法时间为T(n)。则有如下递推式: T(0)=T(1)=a T(n)≤2T(n-1)+b 该递推式的解为O(2n)。 可见程序7-8:0/1背包问题的递归算法时间复杂度最坏情况下为指数级的。 由上述递归过程可知,可采用动态规划法(或备忘录法)求解0/1背包问题。 当物品重量为整数时,可采用动态规划法,自底向上进行计算。 已经计算的子问题的最优解值用二维数组f[j][k]保存(0≤jn,0≤k≤M)。 (也可以采用备忘录方法,在递归计算中保存子问题的最优解值。) 由于需要对j和k的不同值计算f[j][k],因此总的计算时间为Θ(nM),其中M是背包载重量,n是物品个数。 但是当物品重量和背包载重为实数时,子问题的最优解值f(j,X)是X(0≤X≤M)的连续函数,上述方法便行不通了。 物品重量为实数的0/1背包的动态规划算法 从式(7-25)f(j,X)的递推式 可知: 子问题的最优解值f(j,X)是 X(0≤X≤M)的阶梯形单调非减函数。 (见例7-8) Xwj时只有f(j-1,X)一种选择 例7-8 有0/1背包问题n=3,(w0,w1,w2)=(2,3,4),(p0,p1,p2)=(1,2,4),M=6,求最优解值f(2,6)。 最优解值 f(2,6)=5 1 2 3 4 5 6 7 8 1 2 0 -∞ f(-1,X) X 1 2 3 4 5 6 7 8 1 2 0 -∞ f(0,X) X 1 2 3 4 5 6 7 8 1 2 0 -∞ f(1,X) X 3 函数f是阶梯形非减曲线,可以由一组阶跃点来描述。 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 0 ﹣∞ f(2,X) X 9 函数f(j,X)是由f(j-1,X)和f(j-1,X-wj)+pj的函数曲线,按X相同时取大值的方式生成的。 由于 将f(j-1,X)在X轴上右移wj个单位,然后上移pj个单位,就可得到f(j-1,X-wj)+pj的图像。 1 2 3 4 5 6 7 8 1 2 0 -∞ f(-1,X) X 1 2 3 4 5 6 7 8 1 2 0 -∞ f(0,X) X 1 2 3 4 5 6 7 8 1

文档评论(0)

我是追梦人 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档