Поскольку вам, вероятно, все равно придется использовать грубую силу, вы можете решить свою проблему следующим образом:
Прежде всего, отсортируйте входной набор S.
Затем удалите все элементыот S, которые больше V - 4*|min|
(где |min|
- абсолютное значение наименьшего элемента), потому что они все равно не появятся ни в одном из ваших решений.В зависимости от вашей конкретной задачи, эта оптимизация может быть улучшена в дальнейшем.
Теперь вы генерируете все суммы длины C элементов в S, начиная с наименьшего возможного числа (помните, что S сортируется).
Если результат меньше V, добавьте его в набор решений и увеличьте последнее слагаемое.
В противном случае установите ранее увеличенное слагаемое и все слагаемые после него на минимально возможные значения и увеличьтеСлагаемое перед этим.
Вы можете остановиться, если все слагаемые достигли максимально возможных значений.Возможно, вам удастся остановиться задолго до этого, что оставлено читателю в качестве упражнения из-за моего неаккуратного английского.