打算每天复习一点算法内容,就先从动态规划下手。曾经动态规划让我头疼,重新学了一下觉得还好啦不是很难,实现动态规划算法的核心在于实现它的递推公式,写出递推公式,代码也就很容易了。
动态规划类似分治法,都是将一个大问题分解为一个个小问题,分而治之。不同之处在于,动态规划记忆了重复的子问题,避免了运算过程中的重复计算。
适用情况:有重叠子问题和最优子结构性质(动态规划每一步求的都是最优解)的问题。
下面我们通过经典的动态规划问题(0-1背包问题)来学习这个算法。
问题描述:将N件物品选几件放入容量为W(重量)的背包中,每件物品有自己的重量w和价值v,要求在不超过背包容量情况下使背包内放入的物品总价值最高。
分析:①不超过背包容量,有:Σw[i]<=W (i表示第i件物品)
②对于“将前i件物品放入容量为j的背包中”这个子问题,现只考虑第i件物品放还是不放,如果放了的话,问题转换为“前i-1件物品放入剩下j-w[i]容量的背包中”,如果不放,问题转换为“前i-1件物品放入容量为j的背包中”。这两种情况的优者为当前问题的最优解。
③根据②的分析,得到如下递推公式
其中,0<=i<=N,0<=j<=W.