米脂
您可以使用一个集合来跟踪到目前为止在迭代中给出的数字的所有可能总和。对于每次迭代,将当前数字添加到集合中的每个现有总和以添加到集合中,并将当前数字本身添加到集合中。True当目标和确实在集合中时返回:def has_sum(nums, targetSum): sums = set() for i in nums: sums.update([s + i for s in sums if s + i <= targetSum]) if i <= targetSum: sums.add(i) if targetSum in sums: return True return False以便:has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 29)返回True(因为 1 + 6 + 22 = 29),并且:has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)返回False(因为您问题中的预期输出不正确)。
守着一只汪
您可以递归地尝试满足给定序列中有或没有第一个数字的目标总和,直到给定序列中没有更多数字,或者直到给定目标总和不再为正(因为您在评论中提到所有给定的数字是正数):def has_sum(nums, targetSum): if not nums or targetSum <= 0: return False first, *rest = nums return first == targetSum or has_sum(rest, targetSum - first) or has_sum(rest, targetSum)以便:has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 29)返回True(因为 1 + 6 + 22 = 29),并且:has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)返回False(因为您问题中的预期输出不正确)。编辑:为了避免在每次调用中将输入序列减去第一项复制到性能影响rest,可以使用索引改进上面的代码:def has_sum(nums, targetSum, index=0): if index == len(nums) or targetSum <= 0: return False num = nums[index] return num == targetSum or has_sum(nums, targetSum - num, index + 1) or has_sum(nums, targetSum, index + 1)