mat*_*teo 2 python dynamic-programming
我正在尝试获得目标金额总和的所有硬币。我能够获得所需数量的硬币。我将如何解决它。
您可以无限地使用相同的硬币,例如。change([2], 10)=>[2, 2, 2, 2, 2]
def change(coins, amount):
result = [amount+1] * (amount+1)
result[0] = 0
for i in range(1, amount+1):
for coin in coins:
if i >= coin:
result[i] = min(result[i], result[i-coin] + 1)
if result[amount] == amount+1:
return -1
return result[amount]
Run Code Online (Sandbox Code Playgroud)
change([1, 2, 5,8], 7)=>[5, 2]顺序并不重要。
如果你使用dyanmic programming只能得到最好的结果,你可以通过使用数组来存储 的中间结果来实现这一点dynamic programming,我根据你的 dp 版本进行了修改:
def change(coins, amount):
result = [amount+1] * (amount+1)
coins_results = [[] for _ in range(amount+1)]
result[0] = 0
for i in range(1, amount+1):
for coin in coins:
if i >= coin and result[i - coin] + 1 < result[i]:
result[i] = result[i-coin] + 1
coins_results[i] = coins_results[i-coin] + [coin]
if result[amount] == amount+1:
return []
return coins_results[amount]
Run Code Online (Sandbox Code Playgroud)
测试:
print(change([1, 2, 5, 8], 7))
print(change([2], 10))
Run Code Online (Sandbox Code Playgroud)
输出:
[5, 2]
[2, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
这是一个输出所有结果的版本backtracking:
def change(coins, amount):
res = []
def backtrack(end, remain, cur_result):
if end < 0: return
if remain == 0:
res.append(cur_result)
return
if remain >= coins[end]:
backtrack(end, remain - coins[end], cur_result + [coins[end]])
backtrack(end - 1, remain, cur_result)
backtrack(len(coins) - 1, amount, [])
return res
Run Code Online (Sandbox Code Playgroud)
测试:
print(change([1, 2, 5, 8], 7))
print(change([2], 10))
Run Code Online (Sandbox Code Playgroud)
输出:
[[5, 2], [5, 1, 1], [2, 2, 2, 1], [2, 2, 1, 1, 1], [2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]]
[[2, 2, 2, 2, 2]]
Run Code Online (Sandbox Code Playgroud)
希望对您有帮助,如有其他疑问,请评论。:)
| 归档时间: |
|
| 查看次数: |
2402 次 |
| 最近记录: |