Вы можете рекурсивно попытаться удовлетворить целевую сумму с первым числом в данной последовательности или без него, пока в данной последовательности не останется числа или пока заданная целевая сумма не станет положительной (поскольку вы упомянули в комментарий, что все заданные числа положительные):
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)