¿Cómo se puede dividir un conjunto de números en dos subconjuntos de modo que el XOR de los elementos en un subconjunto sea igual al XOR de los elementos en el otro y sea lo más grande posible?

Esta división es posible si el xor de todos los elementos en el conjunto es cero. Bueno, supongamos que la solución existe. Eso significa que el xor de todos los elementos en la matriz es cero.
Ahora, si contamos el bit establecido de cada posición de bit de todos los números, entonces será un número par, ya que xor de todos los números es cero, por lo que nuestra tarea es distribuir esos bits establecidos en dos subconjuntos para cada posición de bit para que xor de todos los números en un subconjunto son iguales al otro.
Aquí está mi código en C ++

nulo DivideAnArray (conjunto vectorial) {
// longitud del conjunto dado
int n = set.size ();

int xr = 0, colocado [n];
int set1 = 0, set2 = 0;
para (int i = 0; i <n; i ++)
{
xr = xr ^ conjunto [i]; // calcular XOR de todos los números
colocado [i] = 0; // inicializando colocado
}
// el xor de todos los elementos en la matriz es cero.
si (xr! = 0)
{
cout << "¡Solución no posible!" << endl;
regreso;
}

para (int bit = 0; bit <32; bit ++)
{
set1 = 0; set2 = 0; // estos dos números deben ser iguales para cada posición de bit
para (int i = 0; i <n; i ++)
{
si (colocado [i])
{
if (colocado [i] == 1)
set1 ++;
más
set2 ++;
}
más if ((set [i] & (1 << bit)))
{
si (set1 <= set2)
{
colocado [i] = 1;
set1 ++;
}
más
{
colocado [i] = 2;
set2 ++;
}
}
}
}
// esto imprimirá qué número pertenece a qué conjunto (conjunto 1 o conjunto 2)
para (int i = 0; i <n; i ++)
{
cout << set [i] << "se coloca en el subconjunto no:" << place [i] << endl;
}
regreso;
}

Estoy un poco en desacuerdo con el usuario de Quora.

La solución solo existe si xor de todos los elementos es igual a cero.

Pero,

Todas las dos particiones de subconjuntos posibles (2 ^ n – 1 de tales posibilidades) dividen la matriz con la propiedad deseada.

Razonamiento: sabemos que xor de todos los elementos debe ser cero y el hecho de que xor de dos números es cero si y solo si son iguales. Entonces, no importa cómo particione la propiedad requerida.

More Interesting

En informática y lógica matemática, ¿qué es la capacidad de decisión y en qué se diferencia de la capacidad de computación?

¿Existe un algoritmo eficiente para encontrar el primo más pequeño mayor que N?

¿Cuál es el significado de la teoría de la complejidad del caso promedio?

¿Qué conceptos matemáticos son cruciales para un informático?

¿Cuáles son los problemas finales más interesantes del cálculo?

¿Es necesario asumir que una distribución de claves para el hashing para trabajar con O (1) garantiza que sí lo tiene?

¿Cómo puedo calcular los fallos de página a partir de la cadena de referencia y los marcos disponibles?

Si tengo un número (ej .: n = 28), ¿existe una fórmula cerrada para saber cuántos son los pares ordenados de números enteros (a, b) de manera que [matemáticas] a \ cdot b = n [/ matemáticas]?

¿Podría el basilisco de Roko realmente suceder?

Si las computadoras no pueden calcular números flotantes con precisión, ¿cómo funcionan las calculadoras y las computadoras científicas?

Dada la potencia computacional suficiente, ¿serían los objetivos de la mecánica del continuo tan complicados de lograr? Es decir, ¿sería matemáticamente más sencillo modelar sistemas de forma discreta que continua?

¿Puede un programa tener una salida infinita sin repetición sin quedarse sin memoria?

¿Qué es una lista de todos los conjuntos de habilidades requeridas (matemáticas / programación / algoritmos, etc.) para poder programar juegos / escenarios de ajedrez?

¿Cómo es tomar CS 221 (Inteligencia Artificial) en Stanford?

¿Qué tan grande es el almacenamiento necesario para almacenar todas las combinaciones de números primos de 4096 bits como una tabla de búsqueda para descifrar RSA?