动态规划可分为简单的动态规划和背包问题。
其中简单动态规划、例如斐波那契数列或者爬楼问题可以直接写,十分简单。
背包问题会复杂一点,分为01背包和完全背包。现在感觉这类问题的难度主要集中在两点,一是发现这个问题可以用动态规划求解、一般情况下问题会披一个外衣,如何把这个外衣扒下来是有一些难度的。二是找到关于背包代表的数据的定义。
01背包就是可以选择的元素只能选一次,完全背包则是可以选择无穷次。
现在感觉没有必要过分的把精力放在判断什么类型的背包上。主要是要找到迭代的公式和对背包数组的初始化。
对于背包问题,一般会令一个数组,横坐标是背包容量+1,纵坐标为待选数组长度。int[bagWeight][nums.length]。然后对数组进行初始化,一般初始化的内容为第一行和第一列,偶尔需要全部更新(23. 零钱兑换)。然后横向或纵向遍历,对数组元素进行更新。
可以发现每次更新的时候都在使用上一行的内容,且只使用上一行的内容。因此可以考虑将数组的维数减一,得到简化版的求解。简化版求解需要注意是从前往后还是从后往前遍历。01背包是从后往前,完全背包是从前往后。区别就在于普通版的方法中,不放当前nums时用到的数据是上一行(01,从后往前)还是当前行(完全,从前往后)。