Как сказали выше члены, это проблема Подмножества Сумм (или проблема ранца).
Однако сказать, что это невозможно сделать эффективно, не очень точно. Это можно сделать, только не
в полиномиальное время. На самом деле решение довольно просто с использованием динамического программирования
и рекурсия (и в псевдополиномиальное время).
Даны целые числа [a_1, ..., a_n] и число T,
Определить массив S [i, k], чтобы обозначить, если существует подмножество элементов между
a_1, ... a_i, которые складываются в k. (Это двоичная матрица).
Затем мы можем определить рекурсивное отношение следующим образом:
S [i, k] = S [i-1, k] или S [i-1, k-a_j]
На словах это означает, что мы либо используем элемент a_i, либо нет.
Ответ будет расположен в S [n, T].
Какова рабочая нагрузка для построения матрицы S?
Ну, у S есть n * T элементов. Чтобы вычислить каждый элемент,
мы должны сделать O (1) работу. Итак, полный ход
время O (n * T).
Теперь в этом пункте, кажется, я доказал P = NP, так как это
кажется, алгоритм полиномиального времени. Однако помните
что мы измеряем входной размер в двоичном, поэтому T = 2 ^ p для некоторых
п.
Не думаю, что кто-то скажет, что вышеуказанное решение, когда
реализовано должным образом нецелесообразно. На самом деле, для многих
разумные размеры проблемы, это будет работать превосходно.
Кроме того, есть некоторые эвристики для решения этой проблемы, но я
не эксперт в этой области.