动态规划
gyh 2018-09-09
采用动态规划发求解的问题必须具有两个性质:最优子结构和子问题重叠。 动态规划算法的基本要素 (1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 (2)重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质
与分治法相同,动态规划法具有最优子结构性质。动态规划法的解决办法,也是将一个大问题分解为若干个规模较小的子问题,通过合并求解的子问题而得到原问题的解。 与分治法不同,动态规划法的子问题重叠,指分解出的子问题不是相互独立的,有重叠部分。如果采用分治法求解,重叠的子问题将被重复计算多次。 动态规划法采用备忘录做法解决子问题重叠。对每个子问题只求解一次,保存每个子问题的计算结果,就像一个备忘录,当需要再次求解某个子问题是,只要查找备忘录中的结果即可,要求备忘录的查找时间为常数。 ---动态规划求解步骤: (1)找出最优解的性质,并刻画其结构特征。 (2)递归地定义最优值(写出状态转移方程,或称动态规划方程)。 (3)以自底向上(或自顶向下)的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造一个最优解。 f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)} ---动态规划算法基本框架代码
for(j=1; j<=m; j=j+1) // 第一个阶段
xn[j] = 初始值;
for(i=n-1; i>=1; i=i-1)// 其他n-1个阶段
for(j=1; j>=f(i); j=j+1)//f(i)与i有关的表达式
xi[j]=j=max(或min){g(xi-1[j1:j2]), ......, g(xi-1[jk:jk+1])};
t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案
print(x1[j1]);
for(i=2; i<=n-1; i=i+1)
{
t = t-xi-1[ji];
for(j=1; j>=f(i); j=j+1)
if(t=xi[ji])
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19