为什么代码会给我错误的金额输出? (更改制作问题)
Why does the code give me wrong output for an amount? (Change making problem)
我正在尝试解决硬币找零问题,在该问题中我们必须找到加起来达到特定数量的最少硬币数量。
这是我想出的解决方案:
import sys
denomination = [1,6,10]
amount = 12
def coin_change(amount,denomination):
coins = 0
ans = [0]*(amount+1)
temp = sys.maxsize
for i in range(len(ans)):
for j in range(len(denomination)):
if denomination[j] <= i:
ans[i] = min(temp, ans[i-denomination[j]]) + 1
return ans
print(coin_change(amount,denomination))
输出为
[0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3].
为什么 12 的输出中最后一个数字是 3?我已经检查了很多次代码,但我仍然不明白为什么会这样。它为 6 的数量给出 1,因此它应该为 12 的数量而不是 3 给出 2。
我的代码有什么问题?
问题是 min(temp, ...)
是一个无用的调用,因为您永远不会减少 temp
的值。这个表达式总是转到 return 第二个参数。显然你真的需要比较备选方案并选择最佳的,所以这是错误的。
这就是你得到 3 的原因。最后尝试的面额是 10(当 j
是 2 时)。在那次尝试之前,ans[12]
实际上是 2,但它被 3 (10+1+1) 覆盖了!
这里更正:
import sys
denomination = [1,6,10]
amount = 12
def coin_change(amount,denomination):
ans = [sys.maxsize]*(amount+1) # initialise with maximum value
for i in range(len(ans)):
for j in range(len(denomination)):
if denomination[j] <= i:
if denomination[j] == i:
ans[i] = 1 # base case
else: # see if we can improve what we have
ans[i] = min(ans[i], ans[i-denomination[j]] + 1)
return ans
print(coin_change(amount,denomination))
我正在尝试解决硬币找零问题,在该问题中我们必须找到加起来达到特定数量的最少硬币数量。
这是我想出的解决方案:
import sys
denomination = [1,6,10]
amount = 12
def coin_change(amount,denomination):
coins = 0
ans = [0]*(amount+1)
temp = sys.maxsize
for i in range(len(ans)):
for j in range(len(denomination)):
if denomination[j] <= i:
ans[i] = min(temp, ans[i-denomination[j]]) + 1
return ans
print(coin_change(amount,denomination))
输出为
[0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3].
为什么 12 的输出中最后一个数字是 3?我已经检查了很多次代码,但我仍然不明白为什么会这样。它为 6 的数量给出 1,因此它应该为 12 的数量而不是 3 给出 2。
我的代码有什么问题?
问题是 min(temp, ...)
是一个无用的调用,因为您永远不会减少 temp
的值。这个表达式总是转到 return 第二个参数。显然你真的需要比较备选方案并选择最佳的,所以这是错误的。
这就是你得到 3 的原因。最后尝试的面额是 10(当 j
是 2 时)。在那次尝试之前,ans[12]
实际上是 2,但它被 3 (10+1+1) 覆盖了!
这里更正:
import sys
denomination = [1,6,10]
amount = 12
def coin_change(amount,denomination):
ans = [sys.maxsize]*(amount+1) # initialise with maximum value
for i in range(len(ans)):
for j in range(len(denomination)):
if denomination[j] <= i:
if denomination[j] == i:
ans[i] = 1 # base case
else: # see if we can improve what we have
ans[i] = min(ans[i], ans[i-denomination[j]] + 1)
return ans
print(coin_change(amount,denomination))