动态规划第4讲.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划第4讲

动态规划(提高组) 绍兴柯桥中学 吴建锋 部分背包问题 N个物品,每个物品有总价值a[i]和体积v[i],背包的总体积是W,每个物品可以部分拿取,问最大可以获得价值。 部分背包问题 1、获取价值最大,就是在装满背包的前提下获得总价值最大 2、要使总价值最大,显然要使单位体积的价值含有量最大 3、因为物品可以一份份取,导致每个物品装入时的性价比是固定的(就是a[i]/v[i]) 部分背包问题算法 为了让每份背包单位体积价值最大,只要对所有物品按照性价比从大到小排序,依次装入物品即可,直到背包满或者没有物品可取 01背包问题 N个物品每个有价值a[i]和体积v[i],但每个物品不能分割(要么全部取,要么不取),求最大的背包所含的价值。 01背包问题 1、如果不管哪个物品装入,都能恰好装满背包,那么问题就是“背包单位体积所含价值最大” 2、可能出现的情况是某些性价比较高的物品装入后导致其他性价比较低物品不能装入,导致背包体积被浪费。所以不能再用贪心了 3、只能用DP解决 01背包问题 For i:=1 to n do for j:=0 to w do begin f[I,j]:=f[i-1,j]; if (j=v[i]) and (f[i-1,j-v[i]]+a[i]f[I,j]) then f[I,j]:= f[i-1,j-v[i]]+a[i]f[I,j] end; 01背包的又一个程序 For i:=1 to n do Begin for j:=0 to v[i]-1 do f[I,j]:=f[i-1],j]; for j:=v[i] to w do begin if f[i-1,j-v[i]]+a[i]f[I,j] then f[I,j]:= f[i-1,j-v[i]]+a[i]f[I,j] end; End; 完善程序 1、初始化? Fillchar(f,sizeof(F),0) 2、最终解在哪里? F[n,w]中。因为每个阶段的f[I,j]表示的是前i个物品装入j体积的背包中的最大值,而不是第i个物品装入j中的最大值。 扩展01背包问题 N种物品,每种有无穷多个,价值为a[i],单个体积为v[i],装入总体积为W的背包,求最大价值和。 扩展01背包问题 穷举所有阶段I {物品编号} 穷举状态j {当前背包被占用} 穷举决策k {k:=0 to w/v[i]} 根据决策转移状态到上个可以的子状态,比较各个状态转移后的最优解f[I,j]; end; end; End; 扩展01背包问题 1、k=0时表示物品i不取,则对应的f[I,j]=f[i-1,j] 2、k0时,表示物品i装入了被占用j体积的背包中有k个,这个决策对应的上个可能的子状态是:背包被占用体积是j-v[i](可以不管当前装入的物品i已经装入几个了)。对应的最优解就是:f[I,j]:=f[I,j-v[i]]+a[i] 初步的程序结构 For i:=1 to n do for j:=1 to w do begin f[I,j]:=f[i-1,j]; {不取当前物品i} for k:=1 to j/v[i] do if (j=k*v[i]) and (f[I,j]=f[I,j-v[i]]+a[i]) then f[I,j]:=f[I,j-v[i]]+a[i]; end; end; 另一种形式的程序 For i:=1 to n do for j:=1 to v[i]-1 do f[I,j]:=f[i-1,j]; for j:=v[i] to w do if f[i-1,j]f[I,j-v[i]]+a[i] then f[I,j]:=f[i-1,j] else f[I,j]:=f[I,j-v[i]]+a[i]; 经典问题:矩阵连乘 有n个矩阵,计算他们连乘的最少乘法次数。 输入第一行为一个整数n,表示参加连乘的矩阵的个数,下面n行,依次给出各个矩阵的行数和列数规模。 输出最少的乘法次数(连乘目标是只有一个矩阵)。 输入和输出 输入: 3 1 5 5 20 20 1 输出: 105 前期分析 1、什么是矩阵乘法 2、乘法次数的统计原理 算法分析 1、阶段。分相邻二个矩阵相乘、相邻三个相乘、……n个矩阵相乘来划分阶段。 2、状态。连乘矩阵的起始和终止编号。 3、决策。在i和j矩阵之间如何组合。 状态转移方程 1、f[I,j]表示第i个矩阵到第j个矩阵连乘的最少次数。 2、a[i].x a[i].y表示第i个矩阵的行号和列号 3、转移方程: F[I,j]=min{F[I,k]+f[k+1,

文档评论(0)

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

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

1亿VIP精品文档

相关文档