这个问题已经困扰了我好几天了。
问题是"给出一个硬币列表,例如[10,50,100]和硬币数量列表,例如[1,2,1],返回不同金币总数的数量"
示例:
coins = [10, 50, 100]
quantity = [1, 2, 1]
该功能应返回 9
[10], [50], [100], [10, 50], [10, 100], [50, 100], [10, 50, 100], [50, 50, 100], [1, 50, 50, 100]
我的方法:
a)从硬币,硬币列表中找出所有不同的总和,并将这些总和保存到一组中 b)通过数量,将每个具有多个硬币的硬币添加到集合中现有的不同总和
这种方法有效,但性能非常糟糕。例如,如果coins=[1, 2]
和quantity=[10000, 1]
,则处理时间过长。
请告诉我一些更好的想法如何处理这个问题。感谢
我的代码:
def possibleSums(coins, quantity):
if len(coins) != len(quantity):
return -1
sums = set(coins[:])
coins_len = len(coins)
for len_ in range(1, coins_len):
for s_idx in range(coins_len):
if s_idx + len_ <= coins_len:
tmp = sum(coins[s_idx:s_idx+len_])
for i in coins[s_idx+len_:]:
sums.add(tmp+i)
idx = 0
while idx < coins_len:
if quantity[idx] > 1:
for _ in range(quantity[idx] - 1):
tmp = set()
for element in sums:
if element + coins[idx] not in sums:
tmp.add(element+coins[idx])
sums |= tmp
idx += 1
# END WHILE
return len(sums)