43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
|
|
"""
|
||
|
|
找零问题 — 贪心算法
|
||
|
|
使用最少硬币凑出指定金额
|
||
|
|
"""
|
||
|
|
|
||
|
|
def min_coins_greedy(coins, amount):
|
||
|
|
"""贪心找零(硬币面额需满足贪心选择性质)"""
|
||
|
|
coins_sorted = sorted(coins, reverse=True)
|
||
|
|
result = []
|
||
|
|
remaining = amount
|
||
|
|
|
||
|
|
for coin in coins_sorted:
|
||
|
|
while remaining >= coin:
|
||
|
|
result.append(coin)
|
||
|
|
remaining -= coin
|
||
|
|
|
||
|
|
return result
|
||
|
|
|
||
|
|
def min_coins_dp(coins, amount):
|
||
|
|
"""动态规划找零(通用解法)"""
|
||
|
|
MAX = float('inf')
|
||
|
|
dp = [MAX] * (amount + 1)
|
||
|
|
dp[0] = 0
|
||
|
|
|
||
|
|
for i in range(1, amount + 1):
|
||
|
|
for coin in coins:
|
||
|
|
if i >= coin:
|
||
|
|
dp[i] = min(dp[i], dp[i - coin] + 1)
|
||
|
|
|
||
|
|
return dp[amount] if dp[amount] != MAX else -1
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
coins = [1, 5, 10, 25]
|
||
|
|
amount = 63
|
||
|
|
|
||
|
|
greedy_result = min_coins_greedy(coins, amount)
|
||
|
|
dp_result = min_coins_dp(coins, amount)
|
||
|
|
|
||
|
|
print(f"硬币面额: {coins}")
|
||
|
|
print(f"需要凑出: {amount}")
|
||
|
|
print(f"贪心结果: {greedy_result} (共 {len(greedy_result)} 枚)")
|
||
|
|
print(f"DP最少数量: {dp_result} 枚")
|