什么是动态规划
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。
动态规划的前提是什么?
存在最优解
拿出来任意一块物品,仍旧是最优解
动态规划体现了什么思想?
逆向思维
坚信一定存在一个最优解,才能坚持逆向思维。 包里的物品是不确定的,只能确定包里有若干个物品,但是是哪几个不确定。 只能随机(因为不知道拿的谁,所以这里体现了动态)拿一块儿出来,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),我们就可以把这一块儿排除考虑了,重复这个过程。