Ahora estoy trabajando y haciendo muchos ejercicios de algoritmo. Aquí está mi problema:Algoritmo: encuentra la resta mínima entre la suma de dos matrices
Dados dos matrices: un y b con la misma longitud, el tema es hacer | suma (a) -sum (b) | mínimo, al intercambiar elementos entre a y b.
Aquí es mi aunque:
asumir que cambiar una [i] y b [j], ajuste Delt = suma (a) - suma (b), x = a [i] -b [j]
luego Delt2 = suma (a) -a [i] + b [j] - (suma (b) -b [j] + a [i]) = Delt - 2 * x,
luego el cambio = | Delt | - | Delt2 |, que es proporcional a | Delt |^2 - | Delt2 |^2 = 4 * x * (Delt-x),
Basándose en la idea anterior Tengo el siguiente código:
Delt = sum(a) - sum(b);
done = false;
while(!done)
{
done = true;
for i = [0, n)
{
for j = [0,n)
{
x = a[i]-b[j];
change = x*(Delt-x);
if(change >0)
{
swap(a[i], b[j]);
Delt = Delt - 2*x;
done = false;
}
}
}
}
Sin embargo, ¿alguien tiene una solución mucho mejor? Si tienes, por favor dímelo y te estaría muy agradecido.
Su problema es equivalente a "Dada una matriz a con longitud 2 * ny suma (a) = 2 * S, encuentre exactamente n elementos en la matriz cuyo total sea lo más parecido posible a S. " –
Esto se parece al problema de la mochila disfrazado. –
@ n.m. más como el problema de la partición, como mencionó Mark ... pero hay una restricción adicional: el mismo número de elementos ... – amit