1、什么是背包问题
有n件物品,1个最多可以装下重量为w的背包。每件物品有两个属性,一个是重量,第i件物品的重量为weights[i];一个是价值,第i件物品的价值为values[i]。
2、背包问题的分类
如果每件物品只有1个,则为01背包;
如果每件物品有无数个,则为完全背包;
如果每件物品的数量不相同,则为多重背包;
如果对背包进行了分组,每组只能选一个,则为分组背包。
其中01背包和完全背包最为常见。背包问题的经典资料非[背包九江]莫属。但这份资料对于刚入门的小白来说还是有难度的。
3、力扣题目推荐
力扣上没有最原始的背包问题,都是背包问题的变种,不认真分析,还真看不出是背包问题。
原始01背包问题:https://www.lintcode.com/problem/125/
原始完全背包问题:https://www.lintcode.com/problem/440/
力扣01背包问题:
分割等和子集,最后一块石头的重量II,目标和,一和零
力扣完全背包问题:
零钱兑换II,组合总和IV,爬楼梯,零钱兑换,完全平方数,单词拆分
以上题目听名称好像和背包问题毫不相关,但都可以使用背包的思想进行解题。
4、解法、
背包问题可以使用回溯法或者动态规划进行解题。
回溯法名字听着响亮,但改变不了其暴力解法的本质。他是通过枚举所有的可能性,从中找到我们想要的解法。回溯法一般都要进行剪枝操作或者加缓存,才能达到时间要求。
动态规划是比较高效的解法,但是需要找出递推公式。递推公式因题而异,的确很难掌握。