背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题。

一、0/1背包问题 每个物品最多只能放一次或者选择不放, 所以是0/1背包问题.
二、完全背包问题 每种物品无限多个,可以将某个性价比高的物品一直放。
三、多重背包问题 每种物品有多个,可以选择0个,1个,…,多个物品。
四、混合背包 多种背包问题混合在一起:数量无限是完全背包,数量有限是多重背包,分类讨论即可。
五、分组背包 多组物品,每组多种物品,每组物品只能选择一个。
01背包倒着搜;完全背包正着搜;多重背包二进制存,再套个01背包;分组背包按组来搜。
六、关于DP要理解的关键点:
DP的本质 求有限的集合中的最值(个数)。本质上,DP代表了走到阶段i的所有路线的最优解。
DP需要思考的点:
1、DP的状态是什么?状态要求什么:最大、最小、数量
2、DP的状态计算?状态转义方程;求解方法:a、递推 b、考虑阶段i (最后一个阶段的值)的值是如何得来的;
3、DP的边界是什么?
关键术语:阶段、状态、决策(状态转移方程)、边界。
七、二维费用的背包问题
八、有依赖的背包
九、背包问题的方案数
十、背包求最小值
求最小值时, 将前面背包的模板中的max 改成min. 注意初始值.
memset(dp, 0x3f, sizeof(dp));
f[0] = 0;