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