我一直在解决Project Euler上的问题/练习,希望通过Python学习一些最优算法和编程惯用语。
我遇到了一个问题,要求找到所有使用至少两个值以使总和为100的独特组合。在研究这个问题时,我发现人们提到了硬币问题和贪婪算法,这正是这个问题所涉及的内容。
我以前听说过贪婪算法,但从未理解或使用过它。我认为我可以试试。我仍然不确定这是否是正确的做法。
我遇到了一个问题,要求找到所有使用至少两个值以使总和为100的独特组合。在研究这个问题时,我发现人们提到了硬币问题和贪婪算法,这正是这个问题所涉及的内容。
我以前听说过贪婪算法,但从未理解或使用过它。我认为我可以试试。我仍然不确定这是否是正确的做法。
def greedy(amount):
combos = {}
ways = {}
denominations = [1,5,10,25]
## work backwards? ##
denominations.reverse()
for i in denominations:
## check to see current denominations maximum use ##
v = amount / i
k = amount % i
## grab the remainder in a variable and use this in a while loop ##
ways.update({i:v})
## update dictionarys ##
combos.update({i:ways})
while k != 0:
for j in denominations:
if j <= k:
n = k/j
k = k % j
ways.update({j:n})
combos.update({i:ways})
ways = {}
return combos
我知道这不是解决欧拉问题的正确方式,但我想要理解并学习如何最优地使用该算法。我的问题是,这是否被认为是一种合适的贪心算法?如果不是,我做错了什么。如果正确,我能否进行优化?
dict.update({key:value})
对我来说似乎非常奇怪(因此我想知道是否有什么微妙的事情发生了)。但是,它与更清晰的dict[key]=value
在效果上完全相同,我建议使用后者。当您需要添加许多值或另一个字典(例如dict.update(dict2)
)时,dict.update()
方法非常有用。 - Blckknghtdict[key]=value
会覆盖字典中已有的key
对应的值,但不会删除字典中其他的值。 - Matt