Это вариант задачи SUBSET-SUM, а также NP-Hard, такой как SUBSET-SUM.
Но если задействованные числа малы, существуют алгоритмы псевдополиномиального времени.Проверить:
http://en.wikipedia.org/wiki/Subset_sum_problem
Ok Подробнее.
Следующая задача:
Задан массив целых чисел, а целые числа a, b, есть некоторое подмножество, сумма которого лежит в интервале [a, b], является NP-сложным.
Это так, потому что мы можем решить сумму подмножеств, выбрав a = b = 0.
Теперь эта проблема легко сводится к вашей проблеме, и поэтому ваша задача тоже NP-Hard.
Теперь вы можете использовать алгоритм приближения полиномиального времени, упомянутый в вики-ссылке выше.
Учитывая массив из N целых чисел, цель S и порог аппроксимации c,
существует алгоритм аппроксимации полиномиального времени (включая 1 / c), который сообщает, существует ли сумма подмножеств в интервале [(1-c) S, S].
Вы можете использовать это многократно (с помощью некоторой формы двоичного поиска), чтобы найти наилучшее приближение к S, в котором вы нуждаетесь.Обратите внимание, что вы также можете использовать это на интервалах от [S, (1 + c) S], в то время как рюкзак даст вам только решение <= S. </p>
Конечно, могут быть лучшие алгоритмы, вНа самом деле я могу поспорить на это.В сети должно быть много литературы.Некоторые поисковые термины, которые вы можете использовать: алгоритмы аппроксимации для суммы подмножеств, алгоритмы псевдополиномиального времени, алгоритм динамического программирования и т. Д.