Нахождение всех возможных перестановок фиксированной длины чисел для достижения заданной суммы - PullRequest
0 голосов
/ 26 октября 2018

Я бы хотел изменить функцию Python subset_sum() из Поиск всех возможных комбинаций чисел для достижения заданной суммы , чтобы:

  1. Это позволяло повторять (перестановки)) вместо комбинаций
  2. Он учитывает только перестановки заданной длины

Я успешно выполнил # 2, но мне нужна помощь с # 1:

def subset_sum(numbers, target, length, partial=[]):
    s = sum(partial)

    # check if the partial sum is equals to target
    if s == target and len(partial) == length:
        print(f"sum({partial})={target}")
    if s >= target:
        return  # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        subset_sum(remaining, target, length, partial + [n]) 

Желаемый результат должен быть:

>>> subset_sum([3,9,8,4,5,7,10],target=15,length=3)
sum([3, 8, 4])=15
sum([3, 4, 8])=15
sum([4, 3, 8])=15
sum([4, 8, 3])=15
sum([8, 3, 4])=15
sum([8, 4, 3])=15
sum([3, 5, 7])=15
sum([3, 7, 5])=15
sum([5, 3, 7])=15
sum([5, 7, 3])=15
sum([7, 3, 5])=15
sum([7, 5, 3])=15

1 Ответ

0 голосов
/ 26 октября 2018

Поскольку вы решили проблему определения одного решения в каждой группе эквивалентности, я советую: не не изменить этот алгоритм.Вместо этого используйте itertools.permutations для генерации следующих предметов:

return list(itertools.permutations(numbers))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...