1.了解动态规划
写的不是特别详细,凑合看吧,嘿嘿, 快要考试了,攒人品....
动态规划的核心思想就是避免子问题重复计算,采用用空间换取时间的方法提高算法效率,比如用递归实现的斐波那契数与用数组记录子问题实现的递推算法就是最简单的动态规划思想,用表的形式记录子问题,防止重复求解,类似的例子也使用与其他递归公式,难点在于最优子结构性质的发现与证明,通常找出最优子结构后都能写出递推表达式,从而写出动态规划的算法.
动态规划的解题方法:
如果存储解的数组是二维的,或可用二维数组解决的,通常可以画出二维矩阵,行坐标与竖坐标分别对应问题中实际意义.举一个简单的实际的带数据的例子.按照最优子结构(如果还没找到,就根据问题要求),自底向上的求解,最后通常能准确的写出递推关系.
2.典型动态规划例题
2.1 0-1背包问题
2.1-1.问题描述:
一共n中物品,每样物品只有一件,物品i的重量为wi>0,价值为vi,背包的最终容量为weight,求如何添加物品,在不超过背包容量的情况下,背包中物品的价值最大?
分析: 这是一道典型的动态规划题目,当然可以用回溯法枚举每一种可能,最后求出最大值,但是回溯法的搜索空间为2^n,即每一种物品都有选和不选之分,选择该物品为1,为右子树,不选该物品为0,在为左子树,这样的一个搜索空间为2^n,复杂度为O(2^n). 由于0-1背包问题很显然含有很多子问题,画出回溯法时的解空间树就可以知道有很多重叠的子树,因此我们考虑用动态规划方法求解.
2.1-2.动态规划方法,找出最优子结构
设Z={z1, z2, z3, ....,zn}是一个最优解,其中zi=1表示背包中含有该物品,zi=0表示背包中不含该物品.0-1背包问题Knap(n, weight)在此时的价值为dp[n][weiht].下面为0-1背包的最优子结构.
(1) 如果zn=1,那么dp[k-1][weight - w[n]] + v[n] > dp[n-1][weight],而且{z1,z2,…,zn-1}是Knap(n-1,weight- w[n])的最优解.(最优解包含子问题的最优解)
(2) 如果zk=0,那么dp[n-1][weight - w[n]) + v[n] <= dp[n-1][weight],而且{z1,z2,…,zn-1}是Knap(n-1,weight)的最优解。
证明:
(1)如果dp[k-1][weight - w[n]] + v[n] <= dp[n-1][weight],则有dp[n][we