正整数列表中的不同总和

时间:2018-03-19 06:38:13

标签: python math sum combinations

这个问题已经困扰了我好几天了。

问题是"给出一个硬币列表,例如[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)

0 个答案:

没有答案