有两个序列a,b 大小都为n, 序列元素的值为任意整数, 无序.
要求: 通过交换a,b中的元素, 使[序列a元素的和]与[序列b元素的和]之间的差最小
例如:
var a = {100,99,98,1,2,3};
var b = {1,2,3,4,5,40};
/*********************************
a[i]和b[j]交换后
差值 = sa - a[i] + b[j] - (sb + a[i] - b[j])
= tmp - 2(a[i] - b[j])
*********************************/
void swap(char *a, char *b)
{
char c = 0;
c = *a;
*a = *b;
*b = c;
}
int get_sum(char *str, int n)
{
if(n > 0)
{
return str[n-1] + get_sum(str, n-1);
}
else if(n == 0)
{
return 0;
}
}
int main()
{
char a[] = {100,99,98,1,2,3};
char b[] = {1,2,3,4,5,40};
int i = 0, j = 0;
int sa = 0, sb = 0; //记录a,b的和
int tmp = 0; //记录差值
int flag = 0; //标记数组大小
for(i = 0; i < 6; i++)
{
for(j = 0; j < 6; j++)
{
if(flag = 1)
{
if((a[i] - b[j] > 0) && (a[i] - b[j] < tmp))
{
swap(&a[i], &b[j]);
}
}
else
{
if((a[i] - b[j] < 0) && (b[j] - a[i] < tmp))
{
swap(&a[i], &b[j]);
}
}
}
sa = get_sum(a, sizeof(a)/sizeof(a[0]));
sb = get_sum(b, sizeof(b)/sizeof(b[0]));
if(sa > sb)
{
flag = 1;
tmp = sa - sb;
}
else
{
tmp = sb - sa;
}
}
}