动态规划解题示例

一、动态规划

动态规划问题解决的思路一般有以下几步:

  1. 确定状态:在动态规划问题中,状态一般就是我们需要优化的问题中的变量。状态需要满足无后效性(即某一阶段的状态一旦确定,就不受之后决策的影响)。

  2. 确定状态转移方程:状态转移方程是动态规划问题的关键。通过已知的状态和决策,求出下一步的状态。状态转移方程需要满足最优子结构性质(即一个问题的最优解包含其子问题的最优解)。

  3. 确定边界条件:边界条件是指动态规划问题中最小子问题的解,也就是动态规划过程中需要初始化的值。

  4. 确定求解顺序:动态规划问题一般有自底向上和自顶向下两种求解方式。自底向上需要先求解最小子问题的解,然后逐步求解更复杂的问题。自顶向下则是从最大的问题开始逐步拆解成小问题,直到求解最小子问题的解。

  5. 求解问题:根据求解顺序和状态转移方程,计算所有可能状态的值,最终得到问题的最优解。

  6. 子问题求解后,更新对应的样本节点的值为子问题求解值(比如第五个节点为伪节点的最大和存在第五个节点中)

需要注意的是,动态规划问题需要具有重叠子问题和无后效性,才能使用动态规划求解

举例说明动态规划的求解思路:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

举例2:

假设有一个背包,可以容纳指定重量的物品,现在有一些物品,每个物品有各自的重量和价值,如下表所示:

物品编号重量价值
126
223
365
454
546

现在要从这些物品中选择若干个放入背包,使得背包中物品的总重量不超过指定重量,同时背包中物品的总价值最大。这个问题可以用动态规划求解。

首先定义子问题:

设 $f(i,j)$ 表示前 $i$ 个物品放入容量为 $j$ 的背包中所能获得的最大价值。

接下来就可以进行状态转移了:

对于每个物品 $i$,有两种情况:

  • 不选物品 $i$,则 $f(i,j) = f(i-1,j)$。
  • 选物品 $i$,则 $f(i,j) = f(i-1,j-w_i)+v_i$。其中 $w_i$ 表示物品 $i$ 的重量,$v_i$ 表示物品 $i$ 的价值。

因此,可以得到状态转移方程:

$$ f(i,j) = \max(f(i-1,j), f(i-1,j-w_i)+v_i) $$

初始状态为 $f(0,j)=0$,表示没有物品放入背包时的最大价值为0。

最后,问题的解就是 $f(n,W)$,其中 $n$ 表示物品数量,$W$ 表示背包容量。

通过动态规划求解背包问题,可以得到以下表格:

物品编号重量价值0123456
1260066666
2230066999
3650066999
45400669910
546006691012

表格中,每个格子表示在指定背包容量下,放入指定物品编号之前所能获得的最大价值。可以发现,最后一个格子 $f(5,6)=12$,即背包中物品的总价值最大为12。同时,可以根据表格中的信息,得到所选取的物品编号。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值