使用任意数量的硬币计算出2.50英镑的所有不同方式的程序



在英格兰,我们有1,2,5,10,20,50和一磅(100(便士硬币。使用这些硬币,我想计算出可以添加硬币以赚取2.50英镑的所有可能组合。我处理这个问题的方式是列出所有硬币的所有可能组合。为此,我做了以下工作:

ps = [1, 2, 5, 10, 20, 50, 100]
list_of_combos = [[]]
for i in range(7):
for j in range(7):
for k in range(7):
for l in range(7):
for m in range(7):
for n in range(7):
for o in range(7):
print("processing..")
all_combos = (ps[i], ps[j], ps[k], ps[l], ps[m], ps[n], ps[o])
list_of_combos.append(all_combos)

然后从所有可能的组合中,我尝试选择唯一通过这样做实际加起来达到 250 的组合。

for i in list_of_combos:
if sum(i) == 250:
print(i)

我遇到的问题是第一个嵌套循环需要永远才能完成,这基本上使程序无用。我能做些什么来使这个循环更快地完成?谢谢。

我可以给你一个可能会有所帮助的想法。一个替换循环的想法,老实说,我不确定效率如何,但我希望比上面更好,改编自:

如何获取列表元素的所有可能组合?

使用与顶部答案相同的函数:

list(itertools.combinations(iterable, r)) 

但是,请记住,由于您要创建拥有多个硬币的组合列表,因此您可能希望创建一个包含重复项目的新列表。

然而,这是一种非常低效的方法,由于您限制了组合,因此不会得到结果,因为根据这个系统,您永远无法获得 250 个 1c 硬币的答案

更好的方法是反其道而行之,从您可以处理的最大硬币开始:

100 - 100 - 50

然后往下走,以每种不同的方式划分每个硬币,优点是您将执行的每个操作都将用于创建所需的结果。因此,您不会浪费任何循环(在这种方法中很多(,并且您无需进行任何进一步的检查以确保其等于所需的结果(例如,100 100 50是一个结果,除以

例如50 50 50 50 50 50也是一个结果(。您可能希望将检查限制在 2-3 个硬币大小以改善性能,并且只是循环每个结果并进一步潜水以获得每个可能的结果

相关内容

最新更新