Как получить число s из суммы последовательности элементов n не импортируя библиотеки с комбинаторики

у меня есть n чисел и число s которое надо получить складывая любые элементы последовательности из n чисел с друг другом , как подсчитать сколько таких сумм равных s существует в последовательности из n чисел. Вот мой вариант кода

n , s = map(int, input().split())
a = []
k=0
for i in range(n):
    a[i] = int(input())
    if a[i] + a[i] == s:
        ++k

print(k)

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

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

если я не путаю, а могу, то код должен быть такой:

сначала только надо собрать массив чисел и отсортировать их - это нужно для ускорения анализа, чтобы пропускать суммы, превышающие заданный предел иначе на каждой итерации надо рассматривать все числа, да еще держать где-то список чисел, которые уже в сумму участвуют, сортировка позволяет избавиться от этого геммороя

limit = 11

sequence = [5, 6, 1, 65, 12, 3, 5, 7, 2]

def calc(limit, sequence, start, sum, count):

    for pos in range(start, len(sequence)):

        # вычислить сумму
        sum_new = sum + sequence[pos]

        # если сумма больше предела - не рассматривать дальше, поскольку остальные суммы будут больше
        if sum_new > limit:
            break

        # если сумма равна пределу - увеличить счётчик 
        if sum_new == limit:
            count += 1

        # вычислить сумму
        count = calc(limit, sequence, pos + 1, sum_new, count)

    return count


# отсортировать последовательность чисел
sequence.sort()

# вычислить кол-во вариантов сумм
count = calc(limit, sequence, 0, 0, 0)

print(count)

На всякий случай можно посмотреть, а что же все таки находится:

debug = []

def calc(limit, sequence, start, sum, count, result):

    for pos in range(start, len(sequence)):

        # вычислить сумму
        sum_new = sum + sequence[pos]
        result_new = result + [sequence[pos]];

        # если сумма больше предела - не рассматривать дальше, поскольку остальные суммы будут больше
        if sum_new > limit:
            break

        # если сумма равна пределу - увеличить счётчик
        if sum_new == limit:
            debug.append(result_new)
            count += 1

        # вычислить сумму
        count = calc(limit, sequence, pos + 1, sum_new, count, result_new)

    return count


# отсортировать последовательность чисел
sequence.sort()

# вычислить кол-во вариантов сумм
count = calc(limit, sequence, 0, 0, 0, [])

print(*debug, sep="\n")

получается:

src:  [1, 2, 3, 5, 5, 6, 7, 12, 65]
[1, 2, 3, 5]
[1, 2, 3, 5]
[1, 3, 7]
[1, 5, 5]
[2, 3, 6]
[5, 6]
[5, 6]

есть повторяющиеся последовательности, но это потому, что есть одинаковые числа (например, 5)

→ Ссылка