一个2n的整数数组,现要分成个数相等的两组,每组 n 个整数。
设计算法,保证两组和之差的绝对值最小
这有一种思想:不停的交换两部分之间的元素,使得这两部分之间的和之差越来越小。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void change(int *x, int * y)
{
int temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a[4]=
{
4,2,3,6
};
int b[4]=
{
10,11,15,19
};
int i,j;
int sumA=0;
int sumB=0;
for(i=0;i<4;i++)
{
sumA+=a[i];
sumB+=b[i];
}
int ab_diff=abs(sumA-sumB);
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
sumA=sumA-a[i]+b[j];
sumB=sumB+a[i]-b[j];
if ( abs(sumA-sumB) > ab_diff )
{
sumA=sumA+a[i]-b[j];
sumB=sumB-a[i]+b[j];
}
else
{
change(a+i, b+j);
ab_diff = abs(sumA-sumB); //更新差值
}
printf("%d,%d\n",sumA,sumB);
}
}
for(i=0;i<4;i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<4;i++)
{
printf("%d ",b[i]);
}
return 1;
}