01背包.cpp(01背包的模板):
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
用子问题定义状态:即F [ i , v ] F[i, v]F[i,v]表示前i件物品恰放入一个容量为v vv的背包可以获得的最大价值。
则其状态转移方程便是:
F[i, v] = max{F[i - 1, v], F[i-1, v-Ci] + Wi}
1
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:
将前 i ii 件物品放入容量为 v vv 的背包中”这个子问题,若只考虑第 i ii 件物品的策略(放或不放),那么就可以转化为一个只和前 i − 1 i-1i−1 件物品相关的问题。
如果不放第i ii件物品,那么问题就转化“前i − 1 i-1i−1件物品放入容量为v vv的背包中,价值为F [ i − 1 , v ] F[i-1, v]F[i−1,v];
如果放第i件物品,那么问题就转化为“前i件物品放入剩下的容量为v − C i v-Civ−Ci的背包中,此时能获得的最大价值就是F [ i − 1 , v −