复习
- 动态规划的本质是递归。一切动态规划的问题一定能写成递归的形式。递归的本质就是将原问题拆解为子问题,子问题再推导出原问题。递归里每个参数的组合都表示一个状态。
- 动态规划两个重要性质:最优子结构和重叠子问题。用递归式来处理掉后效性,使它变成无后效性。用空间换时间去除冗余。
- 四个基本解题步骤:
3.1 设计暴力算法(递归算法),找到冗余
3.2 找到冗余之后,消除冗余(一维数组,二维数组,三维数组,Map)
3.3 把递归式整理成我们想要的状态转移方程
3.4 用自底向上的编程方式来解决问题
01背包问题
- 小偷由一个容量为W的背包,有n件物品,第iii个物品价值viv_ivi,且重wiw_iwi
- 目标:找到xix_ixi使得对于所有的xi = { 0,1}x_i~=~\{0,1\}xi = { 0,1}
- sum(wi∗xi)<=Wsum(w_i*x_i) <= Wsum(wi∗xi)<=W,且sum(xi∗vi)sum(x_i*v_i)sum(xi∗vi)最大
- 套路:最大
- 暴力回溯怎么写?
#include