Сумма подмножества, но даже размер подмножества

Итак, в основном это та же идея, что и проблема суммы подмножества, но с одним ограничением: найденное подмножество должно иметь четный размер.

Например:

numbers {4, 3, 3, 5, 1, 2, 7, 12}
find subset that sums up to 10
=> solution: {4, 3, 1, 2} (or {3, 7} but not {4, 3, 3} )

Есть ли простой способ найти такое подмножество? (Метод должен быть «эффективным», а не просто перебирать все возможные подмножества ...)

Вот мой код для поиска "нормального" подмножества:

    int n = 8;
    int m = 11;
    boolean[][] S = new boolean[n][m];
    int[] N = new int[] {4, 3, 3, 5, 1, 2, 7, 12};
    S[0][0] = true;
    S[0][S[0]] = true;

for(int i = 1; i < n; i++) {
        for(int j = 0; j < m; j++) {
            if(N[i] == j) {
                S[i][j] = true;
            } else if(j - N[i] >= 0) {
                S[i][j] = S[i-1][j] || S[i-1][j - N[i]];
            } else {
                S[i][j] = S[i-1][j];
            }
        }
    }

person G.M    schedule 01.12.2017    source источник
comment
Разве вы не можете найти все возможные подмножества, а затем отфильтровать их одинакового размера?   -  person Jacob G.    schedule 01.12.2017
comment
Вам нужно найти все подмножества одинакового размера или только одно?   -  person Preston Martin    schedule 01.12.2017
comment
@JacobG. Я знаю, что могу это сделать, но это не очень эффективно, не так ли? Потому что я использую большие входы. Мне просто нужно найти одного ...   -  person G.M    schedule 01.12.2017
comment
@JacobG. Я думаю, что было бы более эффективно найти все подмножества одинакового размера, а затем определить подмножества, сумма которых равна правильному значению.   -  person Preston Martin    schedule 01.12.2017
comment
@PrestonM, как мне найти подмножество одинакового размера? Я знаю, как найти нормальные, но ровные?   -  person G.M    schedule 01.12.2017
comment
Можете ли вы опубликовать код, который у вас есть сейчас?   -  person Preston Martin    schedule 01.12.2017
comment
@PrestonM Чтобы найти нормальное подмножество, я просто использую обычный алгоритм суммы подмножества. (Я еще не использовал откат решения)   -  person G.M    schedule 01.12.2017
comment
Итак, вы хотите, чтобы мы сделали вашу домашнюю работу?   -  person Luisk4    schedule 01.12.2017
comment
@ Luisk4 во-первых: никто не сказал, что это домашнее задание (на самом деле это не так), во-вторых: никто не сказал, что вы должны дать мне решение этого, в-третьих: почему бы вам просто не помочь и не дать мне подсказки, как это решить? (при условии, что вы знаете, как это сделать)   -  person G.M    schedule 01.12.2017


Ответы (1)


В вашем текущем коде S [i] [j] истинно, если вы можете сделать значение j как подмножество чисел до i.

Вместо этого вычисление S [i] [j] [k] истинно, если вы можете сделать значение j как подмножество чисел до i с количеством используемых чисел, равным k по модулю 2.

Другими словами, k равно 0 или 1.

Это потребует примерно вдвое больше вычислений, чем ваше существующее решение.

person Peter de Rivaz    schedule 01.12.2017
comment
хм ... я не совсем понимаю. В каком диапазоне k? Потому что, если бы он находился в диапазоне {0, 1}, количество используемых чисел могло бы быть только 0 или 1 ?? Или k находится в диапазоне {0, 1, ..., N.length}? Я что-то не понимаю? - person G.M; 01.12.2017
comment
k находится в диапазоне {0,1}. k == 0 используется для подсчета подмножеств с четным числом элементов, k == 1 используется для подмножеств с нечетным числом элементов. - person Peter de Rivaz; 01.12.2017