Вы используете срезы для передачи суффиксов array
, это создаст копию с линейным временем выполнения.Чтобы избежать этого, вы можете вместо этого передавать индексы.Еще одно преимущество заключается в том, что индексы можно хэшировать, поэтому вы можете кэшировать (или memoize ) и избегать повторного вычисления ответов:
from functools import lru_cache
def ssum(array, N):
@lru_cache(maxsize=None)
def subsetsum(idx, num):
if num < 1 or idx >= len(array):
return frozenset()
if array[idx] == num:
return frozenset([idx])
with_v = subsetsum(idx + 1, num - array[idx])
if with_v:
return with_v | frozenset([idx])
else:
return subsetsum(idx + 1, num)
return list(array[i] for i in subsetsum(0, N))
>>> ssum([1,1,2], 4)
[1, 1, 2]
К сожалению, все еще стоит копировать полученный ответиз суффикса