数组试题---交换两数组元素使和差最小

/*
*有数组a[n]和b[n],都是无序的
*请交换a,b的某些元素,让它们的
*总和之差最小
*/

#include<stdio.h>
#define SIZE 3
int
sumb (int m[], int n) /*计算数组元素之和*/
{
  int i;
  int sum = 0;
  for (i = 0; i < n; i++)
    sum += m[i];
  return sum;
}

main ()
{
  int min;
  int tmp;
  int i;
  int j;
  int this;
  int a[SIZE] = {
    1, 7, 3
  };
  int b[SIZE] = {
    10, 15, 4
  };

  min = sumb (a, SIZE) - sumb (b, SIZE);
  min = min > 0 ? min : (-1) * min;//初始化min,此时min为两个数组总和之差
  for (i = 0; i < SIZE; i++)
    for (j = 0; j < SIZE; j++)
      {
   /*这里是先互相交换一个元素进行求总和相减,注意,其实两个数组并没有改变,当且仅当
   *这里求得的差比min小时才进行真正的交换
   */
        this = sumb (a, SIZE) - sumb (b, SIZE) + 2 * (b[j] - a[i]);
        this = this >= 0 ? this : (-1) * this;
        if (this < min)//如果this不小于min的话就不进行交换
          {
            min = this;
            if (min == 0)//如果找到差值为0的组合,则提前退出
              break;
            tmp = a[i];
            a[i] = b[j];
            b[j] = tmp;
          }
      }
  printf ("Min=%d\n", min);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值