Алгоритм - найти минимальное вычитание между суммой двух массивов

Сейчас я ищу работу и выполняю много упражнений с алгоритмами. Вот моя проблема:


Учитывая два массива: a и b с одинаковой длиной, субъект состоит в том, чтобы сделать | sum (a) -sum (b) | минимальным путем замены элементов между a и b .


Вот моя мысль:

предположим, что мы поменяем местами a [i] и b [j], установим Delt = sum (a) - sum (b), x = a [i] -b [j]
, тогда Delt2 = sum (a) -a [i] + b [j] - (sum (b) -b [j] + a [i]) = Delt - 2 * x,
тогда изменение = | Delt | - | Delt2 |, который пропорционален | Delt | ^ 2 - | Delt2 | ^ 2 = 4 * x * (Delt-x),

На основании вышеизложенного я получил следующий код:


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;
            }
        }
    }
}

Однако, есть ли у кого-нибудь лучшее решение? Если попал, скажите, пожалуйста, и я буду вам очень признателен!

6
задан Jeremy Banks 19 February 2012 в 20:13
поделиться