三种常见解法:
1. 普通动态规划
建立n维dp数组,保存每一情况的计算结果
每个位置计算出来后值确定,不再发生变动
dp数组计算顺序不限,既可从小下标到大下标,又可从大下标到小下标(因为最外层循环每层计算结果只依赖于上一层的一些计算结果,不受本层其他值更新的影响,依赖上一层还是本层前面的计算结果体现出0-1背包问题和普通背包问题的差别)
2. 动态规划 + 空间优化(时、空效率最高的解法)
建立n-1维dp数组,保存每加入一个选择项后的计算结果
每个位置计算出来后值还有可能被更新:每新加入一个选择项,dp数组先继承前面选择项的结果,再将符合更新条件的dp项更新
dp数组更新顺序必须从大下标往小下标(因为如果从小往大,大下标的更新有可能用到小下标更新后的结果,造成重复,这个顺序体现出0-1背包问题和普通背包问题的差别)
3. recursion + mem
建立n维mem数组
(用n-1维mem数组也能写出逻辑正确的解答,但由于发生很多重复计算,一般会Time Limit Exceeded)
理解参考