我正在做硬币改变问题。我已经完成了这个问题,它打印出我需要多少硬币才能实现最少量的更改,但是如何更改我的程序以便打印这些硬币?
以下是I / O示例:
input: coin_change(48, [1, 5, 10, 25, 50])
output: [6, [25, 10, 10, 1, 1, 1]]
input: coin_change(48, [1, 7, 24, 42])
output: [2, [24, 24]]
目前我的代码只返回6。
顺便说一下,这只能通过递归来完成。不允许循环。
代码:
def change(C, V):
def min_coins(i, aC):
if aC == 0:
return 0
elif i == -1 or aC < 0:
return float('inf')
else:
return min(min_coins(i-1, aC), 1 + min_coins(i, aC-V[i]))
return min_coins(len(V)-1, C)
以下代码是我尝试过的,但它不适用于第二个输入
def giveChange(C, V, res = None):
res=[] if res is None else res
if len(V)==0:
return len(res),res
maxx=max(V)
print maxx
V.remove(maxx)
ans=C//maxx
if ans==0 and maxx<C :
print maxx
res +=[maxx]*ans
return len(res),res
else:
res += [maxx]*ans
return giveChange(C % maxx,V,res)
答案 0 :(得分:1)
可能不使用maxx = max(V)
最佳解决方案可以包括小硬币,例如48 = 24 + 24,其具有两个硬币,小于48 = 25 + 10 + 10 + 1 + 1 + 1。在这种情况下,虽然25> 24,但你必须使用更多的小硬币来制作48。
因此,如果您的输入是(48,[1,7,24,42]),您将陷入第二种情况并获得48 = 42 + 1 + 1 + 1 + 1 + 1 + 1。您可以将第二个发布的代码与第一个代码组合在一起,添加一个列表作为存储更改的参数,并使用相同的递归设计。
答案 1 :(得分:0)
您的第一个代码可以进行一些更改。函数可以返回列表甚至(count,[coins])元组,而不是只返回计数。你可能还想要排序V。