有两个序列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;
}
# 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;
}