Tôi đang tìm việc và thực hiện nhiều bài tập thuật toán. Đây là vấn đề của tôi:Thuật toán - tìm phép trừ tối thiểu giữa tổng của hai mảng
Với hai mảng: một và b với cùng một độ dài, vấn đề này là làm | sum (a) -sum (b) | tối thiểu, bằng cách hoán đổi các phần tử giữa a và b.
Dưới đây là mặc dù tôi:
giả sử chúng ta trao đổi a [i] và b [j], thiết lập Delt = sum (a) - sum (b), x = a [i] -b [j]
rồi Delt2 = tổng (a) -a [i] + b [j] - (tổng (b) -b [j] + a [i]) = Delt - 2 * x,
thì thay đổi = | Delt | - | Delt2 |, đó là tỷ lệ thuận với | Delt |^2 - | Delt2 |^2 = 4 * x * (Delt-x),
Dựa trên những suy nghĩ trên, chúng tôi nhận được đoạn mã sau:
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;
}
}
}
}
Tuy nhiên, không ai có giải pháp tốt hơn? Nếu bạn có, xin vui lòng cho tôi biết và tôi sẽ rất biết ơn bạn!
Vấn đề của bạn tương đương với "Cho một mảng có chiều dài 2 * n và tổng (a) = 2 * S, tìm chính xác n phần tử trong mảng có tổng số càng gần S. " –
Điều này trông giống như vấn đề ba lô trong ngụy trang. –
@ n.m. giống như vấn đề phân vùng, như Mark đã đề cập ... nhưng có ràng buộc bổ sung: cùng số lượng phần tử ... – amit