Найти варианты суммы чисел дающих определенное значение

Вопрос больше по части математики и его реализация на Python. Подскажите как можно найти все возможные варианты нахождения суммы цифр для числа например 13. Т.е. мы знаем что 13 это 10+3 или 9 + 4 и так далее.

У меня есть определенный массив чисел например 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Есть переменная a = 13. Для нее нужно найти все возможные варианты получения этого числа путем сложения.

Если есть источники литературы, и ссылки на готовые источники кода может в git Hube, был бы признателен.

Спасибо.


Ответы (3 шт):

Автор решения: whizz169

Если только и правда перебирать все варианты. Помочь может модуль itertools

import itertools as it


a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = 13
comb = it.permutations(a, 2) # it.combinations если не хотите учитывать обратные перестановки

result = [i for i in comb if sum(i) == b]

print(result)

результат:

[(3, 10), (4, 9), (5, 8), (6, 7), (7, 6), (8, 5), (9, 4), (10, 3)]
→ Ссылка
Автор решения: Сергей Попков

Вот есть еще такой вариант:

def summs(answer, *dig):
    res = []
    for i in dig:
        for j in dig:
            if i + j == answer and (i, j) not in res and (j, i) not in res:
                res.append((i, j))
    return res


print(summs(13, *range(10)))

[(0, 13), (1, 12), (2, 11), (3, 10), (4, 9), (5, 8), (6, 7)]
→ Ссылка
Автор решения: Сергей Попков

Как то так, это по поводу " Чтобы использовалось не только два значения"

import itertools


def summs(answer, *dig):

    res = []
    for i in range(1, answer + 1):
        for j in itertools.combinations_with_replacement(list(dig), i):
            if sum(list(j)) == answer:
                res.append(j)
    return res


print(summs(13, *range(1, 11)))

Результат:

[(3, 10), (4, 9), (5, 8), (6, 7), (1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (1, 6, 6), (2, 2, 9), (2, 3, 8), (2, 4, 7)... и тд
→ Ссылка