分类: C/C++
2013-09-24 15:14:19
题目:有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之差的绝对值最小。
网上有各种各样讨论(),但似乎大家把问题都想复杂了。如果想在算法本身的数学基础上下功夫,哪问题可就复杂了,虽然严密的数学理论能使算法高效,但那应该是数学家的事。现在人家是考程序员,不是进行数学考试,所以应该用最朴实的、最直接的方法编程。
#include
#include
#define N 8
int calmin(int a[], int b[])
{
int i, suma = 0, sumb = 0;
for(i=0; i
suma = suma + a[i];
sumb = sumb + b[i];
}
return abs(suma - sumb);
}
void exchij(int a[], int b[], int i, int j)
{
int temp;
temp = a[i];
a[i] = b[j];
b[j] = temp;
}
int main(void)
{
int a[N] = {14, 25, 13, 36, 12, 48, 19, 51};
int b[N] = {12, 18, 26, 11, 85, 18, 94, 13};
int i, j, k, min1, min2;
k = 1;
min1 = calmin(a, b);
while(k == 1)
{
k = 0;
for(i=0; i
for(j=0; j
exchij(a, b, i, j);
min2 = calmin(a, b);
if(min2 >= min1)
{
exchij(a, b, i, j);
}
else
{
min1 = min2;
k = 1;
}
}
}
}
printf("数组a = ");
for(i=0; i
printf("%4d", a[i]);
}
printf("\n数组b = ");
for(i=0; i
printf("%4d", b[i]);
}
printf("\n数组和之差绝对值 = %4d", min1);
return 0;
}