最常见的背包问题有01背包,完全背包,多重背包,分组背包这四种。什么是背包问题?简单来说就是:一个小偷背了一个背包潜进了金店,包就那么大,他如果保证他背出来所有物品加起来的价值最大。
01背包问题的原理(例子): 假设有3个物品(编号为0、1、2,每个物品只有一个!!!),它们有各自的价值和重量,问如何装取物品,得到最大的价值。由于每个物品都有装或不装两个状态,即01状态,所以称为01背包问题。
如图所示:其中背包最大重量为4
物品编号 | 物品重量 | 物品价值 |
0 | 1 | 15 |
1 | 3 | 20 |
2 | 4 | 30 |
暴力破解01背包:
答:每个物品只有取、不取两个状态。那么可以用回溯算法进行暴力搜索,枚举所有的情况。对应的时间复杂度:如果有n个物品。时间复杂度就是2^n次方。(每个物品只有两个状态)
ps:回溯和深度优先的区别?
动态规划的思路解决该问题:
动态规划方法的原理就是把多阶段决策过程转化为一系列的单阶段决策问题,利用各个阶段之间的递推关系,逐个确定每个阶段的最优化决策,最终堆叠出多阶段决策的最优化决策结果。
ps:对比暴力解法,使用动态规划能提高多少性能?
参考链接:动态规划——0/1背包问题(全网最细+图文解析)_偷偷敲代码的青花瓷的博客-CSDN博客_0-1背包问题动态规划算法