• Как это решать?

    Vindicar
    @Vindicar
    RTFM!
    1. Подумать.
    2. Написать код.

    А если серьёзно, задача сводится к разложению числа на заданные слагаемые. Это гуглится.
    Один из способов (необязательно самый быстрый) - рекурсивное разложение. Упрощенно, перебираешь все Ai меньшие N. Выкидываешь это Ai из рассматриваемого набора, и затем рекурсивно пытаешься составить число (N - Ai) из всех Aj, меньших или равных Ai (так как большие слагаемые ты уже рассмотрел).
    Углубляясь в рекурсию, рано или поздно ты наткнёшься на одну из двух ситуаций:
    а) среди Aj есть число, равное искомому. Решение найдено, осталось размотать рекурсию обратно и собрать в кучку использованные Ai.
    б) нет ни одного Aj, меньшего или равного искомому числу. Решения нет.
    В твоём случае будет ещё случай в) Сумма всех Ai меньше N. Решения нет, заплатить не удастся. Это можно проверить вообще сразу.

    Реализовать будет проще, если отсортируешь Ai в порядке убывания. Тогда вместо удаления Ai из списка слагаемых достаточно будет выбрать индекс i, с которого будешь начинать рассмотрение слагаемых - все элементы до i-го либо слишком велики, либо уже были рассмотрены и не пригодились.
    Ответ написан
    3 комментария