动态规划—背包问题(Python)
一、什么是动态规划(Dynamic Programming,DP)
- 1.动态规划是通过组合子问题的解来解决原问题
- 2.动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题
- 3.动态规划算法对每个子子问题只求解一次
- 4.动态规划通常用来求解最优化问题
注:每个子问题必须是离散的,没有依赖关系,比如要解决子问题1必须通过解决子问题2才可以解决。
二、背包问题
问题描述:将四个不同重量不同价值的物品放入一个背包,使得背包中的物品价值总和最大。例如,
| 物品 | 重量 | 价值 |
|---|---|---|
| 音响 | 4 | 3000 |
| 电脑 | 3 | 2000 |
| 吉他 | 1 | 1500 |
| 手机 | 1 | 2000 |
| 将以上物品怎样放入一个载重为4的背包可以获得最大价值,求最优解。 |
三、DP算法思路
1、传统思路
传统思路是将不同物品进行排列组合放入背包,通过比较全部的组合形式以获得最优解,而这种算法是时间复杂度是指数级别,后果就是当子问题越多时计算量将会急剧增长。
2、DP算法思路
DP算法是将主问题分解成若干小问题,自下而上求解子问题。
在这里通过将背包容量分割以及不同物品组成网格,每一行物品将对应的网格填充并比较上一行的价值大小。如下:
具体思路看参考链接。
四、代码例程
1 | # 这里使用了图解中的吉他,音箱,电脑,手机做的测试,数据保持一致 |