Part 1 01背包:
基础模型:
我们先来看一道例题。
一个旅行商有一个容量为 V V V 的背包,现在有 n n n 个物品,每个物品的体积为 v i v_i vi,价值为 c i c_i ci,旅行商想知道,在不超过背包容量的情况下,取一些物品,他能获得的最大价值是多少。注意每个物品只有一件。
思路:
首先,按平常的思维,选取性价比更高的物品是较优的。但是在这个问题中,这种思维显然是不对的,因为物品不可分割,选取性价比高的有可能不能充分利用背包的容量,如这个输入例子:
V:8 n:3
5 5
4 3
4 3
按照贪心思路,第一件物品性价比最高,但是取完后不能再取其他物品,贪心结果为: 5 5 5.
显然,若选取物品 2 2 2 和 3 3 3,体积总和为 8 8 8,价值总和为 6 6 6,满足背包容量,答案更优,为 6 6 6.
因此,贪心是错误的。(但是在这题是可以用贪心解决的,因为物品可分割)
考虑动态规划。
设 f i , j f_{i,j} fi,j 表示取前 i i i 个物品,目前体积和为 j j j 的情况下,最大价值是多少。
因为每种物品只有选或不选两个状态,若选,如果 j ≥ v i j\ge v_i j≥vi 就可从 f i − 1 , j − v i + c i f_{i-1,j-v_i}+c_i fi−1,j−vi+ci 转移而来,若不选,可从 f i − 1 , j f_{i-1,j} fi−1,j 中转移而来,最终转移结果即为这两者的最大值,即 f i , j = max { f i − 1 , j − v i