0

此外,允许数字重复。

我参考了这个程序:

def subset_sum_recursive(numbers,target,partial):
    s = sum(partial)

    #check if the partial sum is equals to target
    if s == target: 
        print "sum(%s)=%s"%(partial,target)
    if s >= target:
        return # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        subset_sum_recursive(remaining,target,partial + [n]) 

def subset_sum(numbers,target):
    #we need an intermediate function to start the recursion.
    #the recursion start with an empty list as partial solution.
    subset_sum_recursive(numbers,target,list())

if __name__ == "__main__":
    subset_sum([3,9,8,4,5,7,10],15)

    #Outputs:
    #sum([3, 8, 4])=15
    #sum([3, 5, 7])=15
    #sum([8, 7])=15
    #sum([5, 10])=15

但我不知道在哪里放置 count 变量,它太混乱了

4

3 回答 3

1

看起来你有一个典型的计数硬币问题。

您在那里看到的所有片段都应该解决您想要解决的问题(它还包括重复使用相同数字的组合)。我发现该 wiki 上的这个 python 版本很方便,但速度很慢:

def changes(amount, coins):
    ways = [0] * (amount + 1)
    ways[0] = 1
    for coin in coins:
        for j in xrange(coin, amount + 1):
            ways[j] += ways[j - coin]
    return ways[amount]

print changes(100, [1, 5, 10, 25])
print changes(100000, [1, 5, 10, 25, 50, 100])

如果您想了解更多信息,请参阅之前对类似问题的回答 - 它分解了问题的可能变体并提供了一个非常好的解决方案。

于 2013-04-17T13:59:19.770 回答
0

不确定解决此问题的规范方法,可能是大师知道的。但我发现我的解决方案非常好:

import itertools
inp = [3,9,8,4,5,7,10]
outp = list()
target = 15
for x in range(2,len(inp)):
    outp.extend([ tsum for tsum in itertools.combinations(inp,x) if sum(tsum) == target ])
outp

UPD 这对于小输入是相当令人满意的。对于大输入,它不能很好地扩展。– @gnibbler如果您有大量输入,请考虑阅读此问题

于 2013-04-16T21:30:18.683 回答
0

您还可以在找到一个解决方案时在 main 中定义一个列表并附加到列表中:

if s == target:
        print "sum(%s)=%s"%(partial,target)
        solutions.append("sum(%s)=%s"%(partial,target))

if __name__ == "__main__":
    solutions=[]
    subset_sum([3,9,8,4,5,7,10],15)
    print len(solutions) # output: 4
于 2013-04-16T21:41:39.580 回答