Python 我有一个数字列表和一个特定的总和,我需要计算生成该总和的可能方法的数量
此外,允许重复编号 我参考了该计划:Python 我有一个数字列表和一个特定的总和,我需要计算生成该总和的可能方法的数量,python,Python,此外,允许重复编号 我参考了该计划: 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 w
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变量放在哪里,它太令人困惑了,不确定解决这个问题的标准方法,可能是guru知道的。但我发现我的解决方案相当不错:
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
对于小的输入,这是非常令人满意的。对于较大的输入,它的扩展性不太好@格尼布勒
考虑阅读,如果你有大的输入,你也可以定义一个列表,当找到一个解决方案时,将其附加到列表中:
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
看起来你有一个典型的问题 您看到的所有代码片段都应该解决您想要解决的问题(它还包括重复使用相同数字的组合)。我发现这个python版本在wiki上很方便,虽然速度很慢:
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])
如果你想知道更多,请参考一个类似的问题-它分解了问题的可能变体,并揭示了一个非常好的解决方案 你是说你的算法也应该输出
[3,3,3,3,3]
?这正是你要寻找的:@Moj,来自公认答案的代码就是这个问题的内容。这对于小输入来说非常令人满意。对于大的输入,它不能很好地扩展。