К сожалению, проблема ограниченного k-подмножества является сложной проблемой ... и если вы хотите сгенерировать все таких k-подмножеств, у вас нет выбора, кроме как оцените множество возможных кандидатов .
Существует несколько оптимизаций, которые можно выполнить, чтобы уменьшить пространство поиска.
Учитывая домен x
, содержащий целочисленные значения,
Учитывая положительное целое число M,
Учитывая положительное целое число k для подмножества,
- Если x содержит только положительные целые числа и задана верхняя граница M, удалите все элементы из x больше или равного M. Они не могут быть частью подмножества.
- Аналогично, для k> 1, данного M и x, содержащего натуральные числа, удаляются все элементы из x, которые больше, чем M + min0 + min1 ... minK. По сути, удалите все большие значения, которые, возможно, не могут быть частью подмножества, поскольку даже при выборе небольших значений они приведут к сумме, превышающей M.
- Вы также можете использовать принцип четного / нечетного исключения, чтобы сократить пространство поиска. Например, если k нечетно, а M четно, вы знаете, что сумма будет содержать три четных числа или два нечетных и одно четное. Вы можете использовать эту информацию, чтобы уменьшить пространство поиска, исключив значения кандидатов из
x
, которые могут быть частью суммы.
- Сортировать вектор x - это позволяет быстро исключить значения, которые невозможно включить в сумму.
Многие из этих оптимизаций (кроме четного / нечетного исключения) больше не используются / действительны, когда вектор x содержит отрицательные значения. В этом случае вам, скорее всего, придется провести исчерпывающий поиск.
Как отмечает Jilles De Wit , если X содержит отрицательные числа, вы можете добавить абсолютное значение наименьшего значения в X к каждому члену X. Это сместит все значения обратно в положительный диапазон - делая некоторые из описанных выше оптимизаций возможны снова. Это требует, однако, чтобы вы могли точно представлять положительные значения в расширенном диапазоне. Одним из способов достижения этого является внутреннее использование более широкого типа (скажем, long вместо int) для выполнения поиска выбора подмножества. Однако, если вы сделаете это, не забывайте масштабировать подмножества результатов обратно на это же смещение при возврате результатов.