Dada una lista de conjuntos de 2 números, ¿cómo divide esta lista por la mitad de modo que la suma de cada uno de los números 1 y 2 para ambas mitades sea aproximadamente par?

Si buscas una solución rápida y perfecta, me temo que te decepcionaré. Esto se parece mucho al problema de Partición que es NP-Completo. Por lo tanto, para cualquier otra cosa que no sea una lista pequeña, no existe una solución eficiente conocida (aunque el problema de Partición tiene una solución de tiempo pseudo polinomial)

Un algoritmo codicioso que puede obtener una aproximación (basado en el algoritmo codicioso para el problema de partición) sería (suponiendo que desea minimizar la diferencia de los primeros números + la diferencia de los segundos números):

// S -> lista de tuplas de números
// dejemos que sum1 (X) sea la suma de los primeros números del conjunto, de manera similar sum2 (X)
// i [0] es el primer número de la tupla e i [1] es el segundo
partición de función (S)
A = []
B = []
// i <j si i [0] + i [1] <j [0] + j [1]
Ordenar S en orden descendente
para cada i en S
diff1 = sum1 (A) + i [0] – sum1 (B) + sum2 (A) + i [1] – sum2 (B)
diff2 = sum1 (B) + i [0] – sum1 (A) + sum2 (B) + i [1] – sum2 (A)
si diff1 <diff2
A.push (i)
más
B.push (i)
volver A, B

Básicamente, ¿en cada punto el codicioso algoritmo decide qué es mejor? Agregar i a la lista A o lista B. Mejor, en este caso es qué ruta llevaría a la más pequeña
diferencia de los primeros números + diferencia del segundo número

Supongamos que estas tuplas son un punto en el espacio cartesiano. Digamos que hay 2n tuplas. Encuentra el centroide. Luego encuentra los n puntos más cercanos a este centroide. Este sería un conjunto y el resto sería otro conjunto. La razón simplemente se sigue de la propiedad del centroide.

More Interesting

¿Puedo ser un buen ingeniero informático si mi matemática es débil?

¿Quién gana y por qué: física de estado sólido, informática teórica o programación práctica?

¿En qué ciencia necesitas pensar más analítica y lógicamente?

¿Cuál es una forma intuitiva de entender la solución de programación dinámica ascendente al problema de partición para matrices?

¿Puede un modelo de aprendizaje automático tener exactamente un 100% de especificidad?

¿Qué tan probable es que las computadoras alienígenas se basen en algo equivalente a un UTM?

¿Qué es una explicación intuitiva del teorema de Rice?

¿Cuáles son las áreas más activas de investigación en matemática computacional?

Cómo resolver sumas consecutivas de UVa 12355

¿Cómo funciona el proceso de eliminación en una lista vinculada? ¿Es solo eliminando la referencia del nodo? ¿Qué mecanismo se utiliza para disponer un nodo?

Si [matemática] f (5) = 12 [/ matemática] y [matemática] f (10) = 18 [/ matemática] ¿qué significa [matemática] f (20) =? [/ Matemática] Cuándo (a) [matemática] f [/ math] es una función exponencial y (b) [math] f [/ math] es una función de potencia?

¿Qué se necesita para hacer un compilador para C ++?

¿Por qué es tan difícil encontrar documentaciones útiles y completas sobre métodos criptográficos en Internet?

¿Cuáles son algunas de las ofertas de colocación dadas a los estudiantes de matemáticas de IIT-K? ¿Son equivalentes a los chicos de CS?

Cómo demostrar que [matemáticas] E (n, k) = \ Theta (n ^ \ frac {1} {k}) [/ matemáticas] para la recurrencia del problema clásico de caída de huevos