我現在正在打獵並做許多算法練習。這裏是我的問題:算法 - 找到兩個數組的總和之間的最小減法
給定兩個數組:一個和b具有相同的長度,主題是讓|總和(一)-sum(B)|通過交換a和b之間的元素。
這是我雖然:
假設我們交換一個[i]和B [j]時,設置側平舉=總和(A) - 和(b)中,X = A [1] -b [j]
然後Delt2 = sum(a)-a [i] + b [j] - (sum(b)-b [j] + a [i])= Delt-2 * x,
然後更改 = | Delt | - | Delt2 |,其正比於|側平舉|^2 - | Delt2 |^2 = 4 * X *(側平舉-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;
}
}
}
}
然而,沒有任何人有一個更好的解決方案?如果你有,請告訴我,我會非常感激你!
你的問題等同於「給定一個長度爲2 * n和sum(a)= 2 * S的數組a,在數組中找到正好n個元素,其總數儘可能接近S. 「 –
這看起來像變相揹包問題。 –
@ n.m。更像分區問題,正如馬克提到的......但還有一個額外的限制:相同數量的元素... – amit