Как составить число n из элементов списка?
Я бы решал задачу рекурсивно.
Найди в списке все числа x, меньшие или равные n, определи их позиции в списке, отсортируй по убыванию числа.
Если в списке есть x, равное n, ответ найден.
Иначе перебирай числа по порядку, от больших к меньшим, и для каждого числа x пробуй убрать его из списка, а потом рекурсивно решить задачу для суммы n-x.
Т.е. что-то типа:
def compose_sum(numbers: list[int], total: int) -> list[int] | None:
    # ищем индексы потенциальных слагаемых
    indices = [i for i in range(len(numbers)) if numbers[i] <= total] 
    # сортируем по убыванию слагаемых, потом по порядку в списке
    indices.sort(key = lambda i: (numbers[i], i), reverse=True)
    # если нулевой элемент совпадает - мы нашли точную сумму. Прерываем рекурсию.
    if numbers[indices[0]] == total: 
        return [indices[0]]
    for index in indices: # иначе перебираем слагаемые
        numcopy = numbers.copy()
        # копия списка без рассматриваемого слагаемого
        current = numpcopy.pop(index)
        next_indices = compose_sum(numcopy, total - current)
        if next_indices:  # нашли решение, корректируем индексы (так как мы удалили один элемент)
            for i in range(len(next_indices)):
                if next_indices[i] >= index:
                    next_indices[i] += 1
            return [index] + next_indices # отдаём наше решение "наверх"
        # next_indices пуст/None - решения не нашли, пробуем другой index
    return None # не нашли решения ни для одного index
Я бы решал задачу рекурсивно.
Найди в списке все числа x, меньшие или равные n, определи их позиции в списке, отсортируй по убыванию числа.
Если в списке есть x, равное n, ответ найден.
Иначе перебирай числа по порядку, от больших к меньшим, и для каждого числа x пробуй убрать его из списка, а потом рекурсивно решить задачу для суммы n-x.
Т.е. что-то типа:
def compose_sum(numbers: list[int], total: int) -> list[int] | None:
    # ищем индексы потенциальных слагаемых
    indices = [i for i in range(len(numbers)) if numbers[i] <= total] 
    # сортируем по убыванию слагаемых, потом по порядку в списке
    indices.sort(key = lambda i: (numbers[i], i), reverse=True)
    # если нулевой элемент совпадает - мы нашли точную сумму. Прерываем рекурсию.
    if numbers[indices[0]] == total: 
        return [indices[0]]
    for index in indices: # иначе перебираем слагаемые
        numcopy = numbers.copy()
        # копия списка без рассматриваемого слагаемого
        current = numpcopy.pop(index)
        next_indices = compose_sum(numcopy, total - current)
        if next_indices:  # нашли решение, корректируем индексы (так как мы удалили один элемент)
            for i in range(len(next_indices)):
                if next_indices[i] >= index:
                    next_indices[i] += 1
            return [index] + next_indices # отдаём наше решение "наверх"
        # next_indices пуст/None - решения не нашли, пробуем другой index
    return None # не нашли решения ни для одного index