1) отсортировать по возрастанию.
2) Брать число, которое максимально близко к M (но меньше M).
3) Найти разницу между M и найденным числом и запомнить найденное число
4) Повторить пункты 2 и 4, но искать максимум не с М, а с разницей. И не учитывать число, которое брали в пункте 2.
5) найти сумму чисел с п.3
генерируй массив всех возможных сумм массива Н, меньшую или равную числу М, а потом выбери максимальную. При генерации записывай числа сумм и саму сумму в какую то структуру. Ведь нету ограничений на время и память.
Можно по-другому сделать.
Начать проходить массив с конца. Найдем число 10. Потом поиском (бинарный поиск, сложность log2N) найти число, которое равно (приоритет) или хотя бы меньше чем M - 10 (11-10 = 1). Если найдено число, которое равно разнице - завершить работу и вывести запомненные числа на экран. Если найдено число меньше, чем разница (в нашем случае просто не удачный пример), то искать тем же поиском ещё число, которое равно(приоритет) или меньше чем новая разница.
Если не будет найдено такие числа, что сумма их равна M, значит нужно брать 2е число с конца массива (в примере 7) и никогда не брать числа, большие этого числа. Дальше проделать ту же операцию. В итоге, если не будет найдено множество чисел, сумма которых точно равна M, то вывести на экран все комбинации (если их несколько), которые максимально приближаются к M.
Так вроде будет работать правильно.
1 - выстраиваю массив по возрастанию
2 - нахожу сумму всех чисел
3 - от этой суммы вычитываю сначала масива по 1му елементу начиная от меньшего до тех пор пока эта сумма станет меньше или равна числу заданному М
4 - каждое из чисел сумы выписуется, вошедшое по условию
5 - ети числа обнуляются с массива
6 - идет по циклу наново ищется сумма и вычитываются числа от мелкого
примерно такая логика