Я думаю, что эту проблему можно решить, отметив, какая комбинация произошла.
Моя первая мысль: вы можете использовать 3-мерный массив, чтобы отметить, какая комбинация произошла. Но это не очень хорошо.
Как насчет битового массива (такого как целое число) для пометки? Такие как:
Num 1 = 2^0 for vector 1
Num 2 = 2^1 for vector 2
Num 4 = 2^2 for vector 3
Num 8 = 2^3 for vector 4
Когда вы делаете композицию, просто добавьте все репрезентативные номера. Например, вектор 124 будет иметь значение: 1 + 2 + 8 = 11. Это значение уникально для каждой комбинации.
Это только моя мысль. Надеюсь, это вам как-нибудь поможет.
РЕДАКТИРОВАТЬ : Может быть, я не достаточно ясно о моей идее. Я попытаюсь объяснить это немного яснее:
1) Назначьте для каждого вектора репрезентативное число. Этот номер является идентификатором вектора, и он уникален. Кроме того, сумма каждого подмножества этих чисел является уникальной, это означает, что если у нас есть сумма k представительного числа является М; мы можем легко узнать, какие векторы принимают участие в сумме.
Мы делаем это по присваиванию: 2 ^ 0 для вектора 1; 2 ^ 1 для вектора 2; 2 ^ 2 для вектора 3 и т. Д. ...
С каждой M = суммой (2 ^ x + 2 ^ y + 2 ^ z + ...) = (2 ^ x ИЛИ 2 ^ y ИЛИ 2 ^ z ИЛИ ...). Мы знаем, что вектор (x + 1), (y + 1), (z +1) ... принимают участие в сумме. Это легко проверить с помощью экспресс-числа в двоичном режиме.
Например, мы знаем, что:
2 ^ 0 = 1 (двоичный)
2 ^ 1 = 10 (двоичный)
2 ^ 2 = 100 (двоичный)
...
Так что, если у нас есть сумма 10010 (двоичная), мы знаем, что вектор (число: 10) и вектор (число: 10000) объединяются в сумму.
И, что лучше, сумма здесь может быть вычислена оператором «ИЛИ», что также легко понять, если вы выразите число в двоичном виде.
2) Используя приведенные выше факты, каждый раз, прежде чем подсчитать сумму вашего вектора, вы можете сначала добавить / ИЛИ их представительный номер. И вы можете отслеживать их в виде массива поиска. Если сумма уже существует в массиве поиска, вы можете опустить ее. Тем самым вы можете решить проблему.