这篇文章主要记录动态规划方面的学习。
动态规划的核心思想:
把大问题分解成小问题,记住小问题的解,避免重复计算。
动态规划(DP)的三大特点:
①最优子结构:大问题的最优解可以由小问题的最优解推导出来
②重叠子问题:在求解过程中会反复遇到相同的小问题
③无后效性:当前状态一旦确定,后续过程不受之前决策的影响
🎒0-1背包问题
🛒 生活化题目:吃货的购物计划
题目:妈妈给你一个限重5kg的购物袋,超市有以下零食:
零食 | 重量 | 好吃度 |
---|---|---|
薯片 | 2kg | 4 |
可乐 | 3kg | 5 |
糖果 | 1kg | 3 |
饼干 | 2kg | 3 |
规则:
-
购物袋不能超重(≤5kg)
-
每种零食只能拿一件
-
目标是让总"好吃度"最高
🧩 分步思考图解
第0步:初始化表格(空包状态)
容量 | 0kg | 1kg | 2kg | 3kg | 4kg | 5kg |
---|---|---|---|---|---|---|
价值 | 0 | 0 | 0 | 0 | 0 | 0 |
第1步:考虑薯片(2kg,好吃度4)
if 当前容量 >= 2kg:价值 = max(不装的价值, 装的价值 = 剩余容量的价值 + 4)
容量 | 0kg | 1kg | 2kg | 3kg | 4kg | 5kg |
---|---|---|---|---|---|---|
价值 | 0 | 0 | 4 | 4 | 4 | 4 |
第2步:加入可乐(3kg,好吃度5)
# 容量3kg时:
max(不装=4, 装=0kg价值0 + 5 =5) → 选5
# 容量5kg时:
max(不装=4, 装=2kg价值4 +5=9) → 选9
容量 | 0kg | 1kg | 2kg | 3kg | 4kg | 5kg |
---|---|---|---|---|---|---|
价值 | 0 | 0 | 4 | 5 | 5 | 9 |
第3步:加入糖果(1kg,好吃度3)
# 容量1kg时:
max(不装=0, 装=0kg价值0 +3=3) → 选3
# 容量4kg时:
max(不装=5, 装=3kg价值5 +3=8) → 选8
容量 | 0kg | 1kg | 2kg | 3kg | 4kg |
---|