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;
}
- ¿Existe algún modelo de cálculo X más débil que una máquina de Turing (pero aún no trivial) para el cual una máquina de Turing puede predecir el comportamiento de detención?
- ¿Qué pasaría si se definiera la multiplicación para tener 0 como identidad en lugar de 1?
- ¿Cómo se puede escribir un programa Java que imprima un conjunto completo de las primeras cuatro tablas de multiplicación (hasta 12) organizadas en columnas?
- ¿Hay alguna buena idea sobre cómo optimizar la biblioteca matemática fundamental del sistema?
- ¿Se pueden modelar todos los algoritmos iterativos de forma recursiva y viceversa?
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;
}