【发布时间】:2018-07-11 02:46:15
【问题描述】:
我有一个整数 S 和一个整数集合 A。我需要从集合中找到一组整数,其中这些整数的总和等于 S。它可以是 1 个整数或 50 - 没关系。
我正在尝试这样做:
我有一个数组 res 和一个数组 grp
res 以 [0] 开头,grp 是最初给定的集合,S 是我们要查找的总和,S 是全局的
我的函数需要 (res, grp)
我想这样做:(和示例)
当res元素之和等于S时停止
但是我很讨厌递归,我不知道我应该做什么
这是我的代码
S = 7
grp = [0,5,6,4,3]
def sumFinder(res,grp):
if grp == []:
return grp #in case no pair was found [] is returned
if sum(res) == S:
return res
for i in range (0,len(grp)):
print(res)
print(grp[i])
res += [grp[i]]
newgrp = grp[:i]
newgrp += grp[i+1:]
return sumFinder(res,newgrp)
print(sumFinder([0],grp))
更新:
谢谢大家的回答 感谢 englealuze 让我对解决问题有了更好的了解,谢谢你,我明白了:
1 - 这是为了找到第一个组合并返回它(这是我的目标)
grp = [1,0,1,0,1,2,6,2,3,5,6,7,8,9,2,1,1,9,6,7,4,1,2,3,2,2]
S = 55
grps = []
def findCombination(comb,grp):
for i in range (0,len(grp)):
comb += [grp[i]]
newgrp = grp[:i]
newgrp += grp[i+1:]
if sum(comb) == S:
return comb
if newgrp not in grps:
grps.append(newgrp)
res = findCombination([],newgrp)
if res != None:
return res
print(findCombination([],grp))
2- 这是为了找到所有的组合:(这是 englealuze 谈到的问题,但我不太了解他的方法,即使它看起来更好)
grp = [1,0,1,1,9,6,7,4,1,2,3,2,2]
S = 12
grps = []
combinations = []
def findAllCombinations(comb,grp):
global combinations
for i in range (0,len(grp)):
comb += [grp[i]]
newgrp = grp
newgrp = grp[:i]
newgrp += grp[i+1:]
if sum(comb) == S and tuple(comb) not in combinations:
combinations.append(tuple(comb))
if newgrp not in grps:
grps.append(newgrp)
findAllCombinations([],newgrp)
findAllCombinations([],grp)
print(combinations)
我现在唯一的问题是当 S > 50(在第一个)时,找到答案需要更长的时间
你们能给我什么建议来改进这两种算法?
【问题讨论】:
-
你有什么问题?
-
你不应该在这里首先使用递归,子集和问题通常可以用动态规划快速解决。
-
关键问题是你在一个循环中使用'return'。这导致循环将运行一次而不是 range(0,len(grp))
-
@WillemVanOnsem 我知道,但我从未使用过动态编程,我还在学习递归,我不应该先学习吗?
标签: python arrays list recursion dynamic-programming