Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828939
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: 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;
}

阅读(1563) | 评论(0) | 转发(0) |
0

上一篇:matrix矩正旋转

下一篇:strtok的实现

给主人留下些什么吧!~~