Хотите найти все решения или одно?
Это может найти одно решение (и я думаю, что возможно расширить его, чтобы найти все решения).
Представляет каждый массив в виде двоичного числа.
Таким образом, v1 становится 10011, v2 становится 01001 и т. Д.
Пусть * обозначает побитовое добавление мода 2.
например.
v1*v2*v3 = 00000
Итак, наша цель - найти массивы, в которых добавление мода 2 равно нулю.
Пусть u и v - любое двоичное число.
Тогда u * v = 0 тогда и только тогда, когда u = v.
например.
(v1*v2)*v3 = 0
v1*v2 = 11010 = v3.
Также, если u * v = w, тогда
u*v*v = w*v, so
u*0 = w*v,
u = w*v
Таким образом, мы можем выполнить обратный поиск, начиная с 0. Предположим, что последний набор массивов содержит v. Тогда v * T = 0, где T - некоторое двоичное число. У нас T = 0 * v. Если T является одним из заданных массивов, то мы закончили. В противном случае мы продолжаем поиск, начиная с T.
Это формально описано ниже.
Каждое состояние - это двоичное число.
Пусть 0 будет начальным состоянием.
Указанные массивы являются некоторым подмножеством пространства состояний, скажем S.
Нашей целью является любой элемент в S.
Пусть T будет требуемым подмножеством массивов, сумма которых равна 0.
В каждом состоянии допустимы возможные действия * с любым состоянием, не входящим в T.
После каждого действия ставить массив, используемый в T.
Если S = T на любом нецелевом этапе, то решения не существует.
Теперь мы можем запустить DFS в этом пространстве, чтобы найти решение.