SMILET
在您的情况下,代码是:import itertoolsdef itersum(nums, target): result = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target] if result != target: for j in range(target): result1 = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target + j] result2 = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target - j] if (len(result1) + len(result2)) > 0: result = result1 if result1 > result2 else result2 break return resultA = [12, 79, 99, 91, 81, 44]s = 150itersum(A, s)
慕尼黑8549860
该函数应该返回一个列表列表,因为可能有多个组合加起来为给定的总和:def closest(s, A): if s == 0: return [[]] o = [] for i, n in enumerate(A): if n <= s: for c in closest(s - n, A[i + 1:]): o.append([n] + c) return o以便:closest(150, [12, 79, 99, 91, 81, 47])返回:[[12, 91, 47]]然后:closest(10, [4, 5, 6, 2, 1, 3])返回:[[4, 5, 1], [4, 6], [4, 2, 1, 3], [5, 2, 3], [6, 1, 3]]