算法设计与分析 第2版 第8章-动态规划.ppt

算法设计与分析 第2版 第8章-动态规划.ppt

  1. 1、本文档共132页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * 8.12.2 滚动数组求解0/1背包问题 如果仅仅求装入背包的最大价值(不需求解向量x)。 由于第i个阶段(考虑物品i)的解dp[i][*]只与第i-1个阶段(考虑物品i-1)的解dp[i-1][*]有关,这种情况下保存更前面的数据已经毫无意义。 所以可以利用滚动数组进行优化,将dp数组由dp[MAXN][MAXW]改为dp[2][MAXW]。 求0/1背包问题的状态转移方程如下: dp[0][0]=0,dp[1][0]=0 dp[0][r]=0 dp[c][r]=dp[1-c][r] 当rw[i]时,物品i放不下 dp[c][r]= MAX{dp[1-c][r],dp[1-c][r-w[i]]+v[i]} 否则在不放入和放入物品i 之间选最优解 void Knap() //动态规划法求0/1背包问题 { int i,r; int c=0; for (i=0;i=1;i++) //置边界条件dp[0..1][0]=0 dp[i][0]=0; for (r=0;r=W;r++) //置边界条件dp[0][r]=0 dp[0][r]=0; for (i=1;i=n;i++) { c=1-c; for (r=1;r=W;r++) { if (rw[i]) dp[c][r]=dp[1-c][r]; else dp[c][r]=max(dp[1-c][r],dp[1-c][r-w[i]]+v[i]); } } } i i-1 【例8.4】一个楼梯有n个台阶,上楼可以一步上1个台阶,也可以一步上2个台阶,求上楼梯共有多少种不同的走法。 解:设f(n)表示上n个台阶的楼梯的走法数。 显然,f(1)=1,f(2)=2(一种走法是一步上1个台阶、走2步,另外一种走法是一步上2个台阶)。 对于大于2的n个台阶的楼梯:一种走法是第一步上1个台阶,剩余n-1个台阶的走法数是f(n-1);另外一种走法是第一步上2个台阶,剩余n-2个台阶的走法数是f(n-2)。 所以有:f(n)=f(n-1)+f(n-2)。 对应的状态转移方程如下: f(1)=1 f(2)=2 f(n)=f(n-1)+f(n-2) n2 f(0)=1 f(1)=2 f(n)=f(n-1)+f(n-2) n1 用一维动态规划数组dp[n]存放f(n+1)。对应的求解算法如下: f(0)=1 f(1)=2 f(n)=f(n-1)+f(n-2) n1 int solve() { dp[0]=1; dp[1]=2; for (int i=2;in;i++) dp[i]=dp[i-1]+dp[i-2]; return dp[n-1]; } 但dp[i]只与dp[i-1]和dp[i-2]两个子问题解相关,共3个状态,所以采用滚动数组,将dp数组设置为dp[3],对应的完整程序如下: //问题表示 int n; //求解结果表示 int dp[3]; int solve1() { dp[0]=1; dp[1]=2; for (int i=2; in; i++) dp[i%3]=dp[(i-1)%3]+dp[(i-2)%3]; return dp[(n-1)%3]; } 其他二维数组及高维数组也可以做这样的改进!!! * * * * * * * * * * * * * * * * * * * * * * 当dp数组计算出来后,推导出解向量x的过程十分简单,从dp[n][W]开始: (1)若dp[i][r]≠dp[i-1][r],若dp[i][r]=dp[i-1][r-w[i]]+v[i],置x[i]=1,累计总价值maxv+=v[i],递减剩余重量r=r-w[i]。 (2)若dp[i][r]=dp[i-1][r],表示物品i放不下或者不放入物品i,置x[i]=0。 dp[i][r]=dp[i-1][r] 当rw[i]时,物品i放不下 dp[i][r]= MAX{dp[i-1][r],dp[i-1][r-w[i]]+v[i]} 否则在不放入和放入物品i之间选最优解 例如,某0/1背包问题为,n=5,w={2,2,6,5,4},v={6,3,5,4,6}(下标从1开始),W=10。 求出dp: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 6 6 6 6 2 0 6 6 6 6 6 3 0 6 9 9 9 9 4 0 6 9 9 9 9 5 0 6 6 9 9 12 6 0 6 9 9 10 12 7

文档评论(0)

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

本文库主要涉及建筑、教育等资料,有问题可以联系解决哦

版权声明书
用户编号:5213302032000001

1亿VIP精品文档

相关文档