算法分析与设计之动态规划

1、用动态规划法求解的问题具有的特征

(1)原问题可以分成子问题

(2)子问题之间的递归具有最优子结构的性质

2、动态规划法设计算法一般分成三个阶段

(1)分解

        将原问题分解成若干个相互重叠的子问题。

(2)分析

        分析问题是否满足最优性原理,找出动态规划函数的递推式

(3)求解

        利用递推式自底向上计算,实现动态规划过程

        总之,动态规划法利用问题的最优性原理,以自底向上的方式从子问题的最优解逐步构造出整个问题的最优解。

3、应用的问题

(1)0/1背包问题

        a、问题的形式化描述如下:

        输入:一个物品集S={1,2,...,n}。物品i有重量Wi和价值Vi。重量上限W。

        输出:价值总量最大且重量小于W的物品子集。

(注:这里0/1的意思是我们只能选择这个物品,或者放弃这个物品,不能选择物品的部分,如物品的0.5个)

        b、分析与解决

        我们将求解过程想象成一系列的决策。在第i个决策时,我们考虑是否选择这个物品i

        假设我们已经获得最优解,考虑第一个决策,即最优解中有没有物品n(要不要选物品n)

        选择:需要从{1,2,...,n-1}中选择尽可能贵的物品使得物品重量在W-wn以下

        不选:我们需要从{1,2,...,n-1}中选择尽可能贵的物品使得重量在W以下

        则可以分析出最优子结构:

        OPT(\left \{ 1,2,...,n \right \},W)=max\left\{\begin{matrix} OPT(\left \{ 1,2,...,n-1 \right \},W)\\ OPT(\left \{ 1,2,...,n-1 \right \},W-w_{n})+v_{n} \end{matrix}\right.

        c、0/1背包伪代码

        首先,当没有物品时,背包能装最大价值为0;当开始有物品时按照上面写的结构进行依次选择。

KNANSACK(n,W)
for w=1 to W do
    opt[0,w]=0
end for
for i=1 to n do
    for w=1 to W do
        opt[i,w]=max{opt[i-1,w],opt[i-1,w-wi]+vi}
    end for
end for

d、表格化看0/1背包

假设背包容量为6,有三个物品分别为

可供选择的物品
w1=2v1=2
w2=2v2=2
w3=3v3=3

将其用表格来表示每次选择

i\w0123456
30023355
20022444
10022222
00000000

关于应用还没写完,后面将再补充几个动态的例子及应用的代码~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值