pygorithm/dynamic_programming/dynamic_programming.py

53 lines
1.7 KiB
Python
Raw Normal View History

2023-12-04 12:48:44 +08:00
"""
动态规划的核心
将大问题分解为多个小问题通过解决一个个小问题
并保存解决每个小问题时的状态最终解决大问题
动态规划实现找零
1. 先看找零1元需要多少1
2. 找零2元需要多少两张1元
3. 找零3元需要多少找零2元的结果+找零1元的结果
"""
# 动态规划找零
def dp_rec_mc1(changes: list[int], cash: int):
min_changes = [0 for _ in range(cash + 1)]
for i in range(1, cash + 1):
min_amount = i
for c in filter(lambda x: x <= i, changes):
temp_min_amount = 1 + min_changes[i - c]
if temp_min_amount < min_amount:
min_amount = temp_min_amount
min_changes[i] = min_amount
return min_changes[cash]
# 动态规划找零,并保存每一种找零所需的纸币情况
def dp_rec_mc2(changes: list[int], cash: int):
change_used: dict[int, dict[int, int]] = {}
min_amounts = [0 for _ in range(cash + 1)]
for i in range(1, cash + 1):
min_amount = i
changes_less_then_i = filter(lambda x: x <= i, changes)
for c in changes_less_then_i:
temp_min_amount = 1 + min_amounts[i - c]
if temp_min_amount < min_amount:
min_amount = temp_min_amount
if i - c > 0:
change_used[i] = change_used[i - c].copy()
if change_used[i].get(c):
change_used[i][c] += 1
else:
change_used[i][c] = 1
else:
change_used[i] = {c: 1}
min_amounts[i] = min_amount
if min_amount == i:
change_used[i] = {1: i}
return change_used[cash]