有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
求解关键:
A=sum(a)-sum(b);
i和j之间进行交换后:
A'=sum(a)-a[i]+b[j]-(sum(b)-b[j]+a[i]);
=sum(a)-sum(b)+2(b[j]-a[i]);
int sum(int *a,int n)
{
int sum=0;
for(int i=0;i<n;i++)
sum+=a[i];
return sum;
}
void swap(int *a,int *b,int n)
{
int sum1=sum(a,n);
int sum2=sum(b,n);
printf("%d\n",abs(sum1-sum2));
if(sum1==sum2)
return;
int old=1000;
int cur=1;
bool shift=true;
int pa;
int pb;
while(shift&&cur>0)
{
shift=false;
cur=sum(a,n)-sum(b,n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
int temp=a[i]-b[j];
int newdif=abs(cur-2*temp);
if(newdif<cur&&newdif<old)
{
shift=true;
old=newdif;
pa=i;
pb=j;
}
}
if(shift)
{
int temp=a[pa];
a[pa]=b[pb];
b[pb]=temp;
}
}
}
int main()
{
int a[]={100,99,98,1,2, 3};
int b[]={1, 2, 3, 4,5,40};
swap(a,b,6);
for(int i=0;i<6;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}