Вот как я бы написал: subset_sum
:
def subset_sum(seq, target):
if target == 0:
return True
for i in range(len(seq)):
if subset_sum(seq[:i] + seq[i+1:], target - seq[i]):
return True
return False
Это сработало на нескольких примерах:
>>> subset_sum([-1,1,5,4], 0))
True
>>> subset_sum([-1,1,5,4], 10)
True
>>> subset_sum([-1,1,5,4], 4)
True
>>> subset_sum([-1,1,5,4], -3)
False
>>> subset_sum([-1,1,5,4], -4)
False
Если честно, я бы не знал, какчтобы запомнить его.
Old Edit: Я удалил решение с помощью any()
, потому что после некоторых тестов я обнаружил, что это медленнее!
Обновление: Просто из любопытства вы также можете использовать itertools.combinations
:
from itertools import combinations
def com_subset_sum(seq, target):
if target == 0 or target in seq:
return True
for r in range(2, len(seq)):
for subset in combinations(seq, r):
if sum(subset) == target:
return True
return False
Это может быть лучше, чем подход динамического программирования в некоторых случаях, но в других он зависает (этов любом случае лучше, чем рекурсивный подход).