pygorithm/dynamic_programming/dynamic_programming.py

53 lines
1.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
动态规划的核心:
将大问题分解为多个小问题,通过解决一个个小问题,
并保存解决每个小问题时的状态最终解决大问题
动态规划实现找零:
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]