组合类DP:答案与选择的顺序无关.
首先:所有背包的重点都在于花费(体积…等)和价值的定义,倘若花费有两种,则需要多开一维.
其次:
01背包:重点在于抽象出每个物品只选一次
完全背包:重点在于抽象出每个物品可以选无穷多次
多重背包:重点在于抽象出每个物品有有限个.
混合背包:重点在于抽象出物品可以有1个,可以有无穷多个或者有有限个这三种选择.
分组背包:重点在于抽象出每一组以及每一组里面的选择,也即是抽象出每一组物品之间互斥的多种选择(要明白分组背包问题里面的每一组的每一个选择之间都是互斥的)
二维费用的背包:重点在于抽象出花费和价值,当发现花费有二维甚至是多维的时候就可以考虑了(其实二维费用背包问题就是把数组里面原来表示花费的一维扩展到了两维)
有依赖的背包:待总结
背包问题求方案数:注意状态转移划分子集的时候其实不仅仅是可以维护答案数组的,一样可以维护答案的方案数.
背包问题求具体方案:在状态转移的时候明确当前状态是由哪个状态转移过来的(选择了哪个子集),这个过程可以用数组记录,一步步往前递推即可;也可以求出来最优解,再进行一遍背包问题,与每一步的决策进行比较,判断当前最优解是由哪个最优解(子集)转移过来的,一步步往前推即可.
背包问题求具体方案的小技巧:由于最后判断转移的时候需要从后往前推,因此可以从前往后进行背包问题的求解,再从后往前求具体方案(相当于之前的从前往后).