动态规划
问题背景
有N个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
注意:01背包问题要求一个物品只有0/1两种状态,即装入背包或不装入背包。不能将物品拆分成更小的单位装入,即不能部分装入。对于物品可以部分装入背包的问题,称之为背包问题
动态规划
- 基本思想
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,适合于用动态规划求解的问题,经分解得到的==子问题往往不是互相独立的。==若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。而动态规划可以将得到的子问题的答案,保存在一个表中,避免大量的重复计算,从而得到多项式的时间算法 - 基本要素
最优子结构性质和子问题重叠性质是该问题可用动态规划算法求解的基本要素
1. 最优子结构:
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。
2. 重叠子问题:
在用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要此子问题时,只要简单地用常数时间查看一下结果。
通常,不同的子问题个数随问题的大小呈多项式增长。因此,用动态规划算法通常只需要多项式时间,从而获得较高的解题效率。
动态规划下的01背包
算法思想
动态规划算法以一张表为核心,在表中记录每一个子问题对应的最优解。
例如,得到N级子问题的最优值并存入表中。当需要求解N-1级子问题时,根据最优子结构性质,N-1级子问题的最优解包含了其子问题的最优解。
而对于3个N级子问题,由于重叠子问题性质,3个N级子问题通常不是相互独立,因此避免重复计算,一旦得到一个N级子问题的最优解,就存入表中,对于后面的子问题,若与前面的不独立,则直接在表中调用最优解作为当前子问题的最优解
过程
- 问题抽象化:
一组解:( X1,X2,…Xn ) 其中Xi的取值为 {0,1},代表第i个物品是否装入背包,Xi=0代表不装入背包,Xi=1表示装入背包
Vi代表第i个物品的价值
Wi代表第i个物品的重量 - 求解目标:
M a x ( X 1 V 1 + X 2 V 2 + . . . + X n V n ) Max(X_1V_1+X_2V_2+...+X_nV_n) Max(X1V1+X2V2+...+XnVn) - 约束条件:
X 1 W 1 + X 2