两个数组a[n],b[n]重新排列后,两数组的和的差最小

来源:互联网 发布:免费玻璃排版软件 编辑:程序博客网 时间:2024/06/05 10:37

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小!

如:int a[6]={1,3,4,5,20};  int b[6]={6,30,8,9,10}; 运算后 a[6]={10,9,4,5,20,0};

思想:1)首先求出a数组元素之和与b数组元素之和的差的绝对值。

          2)用a中元素替换b中任意一个元素,重新计算其差的绝对值,如果绝对值小于原来的,则实现元素的交换。

         3)重复上述步骤直到不能交换

具体代码实现:

# include <iostream>using namespace std;int  swap(int * a,int sizea,int *b,int sizeb){int suma=0,sumb=0;for(int ai=0;ai<sizea;ai++)//求数组a的和{suma+=a[ai];}for(int bj=0;bj<sizeb;bj++)//求数组b的和{sumb+=b[bj];}int abssum=abs(suma-sumb),abstemp;//和的差的绝对值for(ai=0;ai<sizea;ai++){   bool flag=false;//是否能交换while(true){for(bj=0;bj<sizeb;bj++){                   abstemp=abs((suma+b[bj]-a[ai])-(sumb-b[bj]+a[ai]));//用a中元素替换b中的元素  if(abstemp<abssum)  {                        suma+=b[bj]-a[ai];sumb+=a[ai]-b[bj];abssum=abstemp;int temp=a[ai]; //交换a[ai]和b[ai]a[ai]=b[bj];//b[bj]=temp;flag=true; break;// 由于发生了交换a,b中的元素都发生了变换,所以跳出bj的for循环,重新开始与b中元素替换  }}if(bj>=sizeb) //结束里层for循环,换下一个a[ai]break;}//如果有交换,且ai的值为最后一个元素,     //那么我们必须重新再来一遍,直到没有元素交换为止.    //重新验证如果没有也可以//if((ai==sizea-1)&&flag)//{//flag=false;//ai=-1;//}}return abssum;}void s(int * a,int *b){a[0]=0;int sizea=sizeof(a)/sizeof(a[0]);cout<<sizea<<endl;}int main(){int a[6]={10, 50, 30, 1, 20, 3};int b[6]={100, 2, 35, 4, 5, 40};  int c=swap(a,6,b,6);cout<<c<<endl;for(int i=0;i<6;i++)cout<<a[i]<<" ";cout<<endl;for( i=0;i<6;i++)cout<<b[i]<<" ";return 0;}