动态规划法
适用的问题:0-1背包问题、最长子序列、矩阵乘法
思想
与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题,经分解得到的子问题往往不是独立的。一般动态规划法需要用一个表来记录所有已解决的子问题的答案。
通常适用于求解具有某种最有性质的问题(全局最优解)。最优解可能会有多个,动态规划法能找出其中的一个最优解。
步骤
1、找出最优解的性质,并刻画其结构特征
2、递归地定义最优解的值
3、以自底向上的方式计算出最优值
4、根据计算最优值时得到的信息,构造一个最优解
性质
1、最优子结构:
如果一个问题的最优解中包含了其子问题的最优解,就说该问题具有最优子结构。
ps:贪心算法也是适用最优子结构的。
贪心算法的性质:a、最优子结构 b、贪心选 择性质
2、重叠子问题:
重叠子问题指用来解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。即当一个递归算法不断地调用同一个问题时,就说明该问题包含重叠子问题。动态规划法总是充分利用重叠子问题,对每个子问题仅计算一次,把解保存在一个在需要时就可以查看的表中,而每次查表的时间为常数。
ps:分治法递归求解,是每次遇到子问题都会视为新问题
0-1背包问题
代码:
#include<stdio.h>
#define N 4 //背包个数
#define W 5 //背包容量
int max(int a,