动态规划

简介: 动态规划

什么是动态规划

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。

动态规划的前提是什么?

存在最优解

拿出来任意一块物品,仍旧是最优解

动态规划体现了什么思想?

逆向思维

坚信一定存在一个最优解,才能坚持逆向思维。
包里的物品是不确定的,只能确定包里有若干个物品,但是是哪几个不确定。
只能随机(因为不知道拿的谁,所以这里体现了动态)拿一块儿出来,i是n的某一个,i可能在包里,可能不在包里(这里也体现了动态)。

假设

假设的前提,是存在。一定存在一个最优解,才能假设最优解,比如最优解为S,或者最优解为X。

以01背包问题为例

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

我们来直接看一下最核心的那个公式:

让我们把关注点放在最中心的表达式上,表达式中出现了两个未知项,i和w,思考一下,i和w分别代表什么?

首先:

c[i,w]代表,背包容量为w,i个物品导致的最优解,注意,此时一定是最优解,背包容量一定是w,但是背包里有几个物品,其实我们是不确定的,我们只知道,背包中装了i个物品里的若干个。同样,i是几其实我们也不知道。

c[i-1,w-wi]+vi代表,背包容量为w时,第i块儿在背包里的情况。

c[i-1,w]代表,背包容量为w时,第i块儿不在背包里的情况。

下面我们反着来想,也就是用逆序思维来想,此时,我们假定c[i,w]就是我们要求的最优解,然后我们随便从n个物品中选择一个,我们假设它就是第i个物品(i可以是任意一个小于n的数),这个物品,可能在这个最优解的背包中,也可能不在这个最优解的背包中,但是一旦我们确定它到底在不在(也就是通过max),我们就可以把这一块儿排除考虑了,重复这个过程。

目录
相关文章
|
5月前
|
算法 测试技术 C++
|
5月前
|
C++ NoSQL 容器
动态规划三
动态规划三
|
5月前
|
C++ NoSQL 容器
动态规划二
动态规划二
|
12月前
|
算法
【学会动态规划】按摩师(11)
【学会动态规划】按摩师(11)
47 0
|
5月前
|
机器人 NoSQL 容器
动态规划一
动态规划一
|
5月前
动态规划1
动态规划1
32 0
动态规划1
动态规划
动态规划
63 0
|
定位技术
动态规划题:夺宝奇兵
动态规划题:夺宝奇兵
83 0
|
人工智能
动态规划的证明题
动态规划的证明题
100 0
动态规划-子序列问题
前言 在上篇文章我们学习了动态规划的公共子序列问题,现在我们来学习下动态规划的单字符串子序列问题。