/* 32. 有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序; 要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小。 例如: var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 首先先计算a,b中元素和之间的差绝对值D,然后逐一的把a中的元素和b中的任一元素作比较, 如果它们交换后的差值绝对值Temp小于原来的值D,那么就把a,b交换,并重新计算a和b的绝对值, 反复的进行,直到a中任一的元素都不能和b中的任一元素交换为止。 */ #include<iostream> #include<stdio.h> #include<math.h> using namespace std; int smallDif(int a[],int b[],int len) { int i,j,temp,sumA=0,sumB=0,cha,f; for(i=0;i<len;i++) sumA+=a[i]; for(i=0;i<len;i++) sumB+=b[i]; cha=fabs(sumA-sumB); f=0; for(i=0;i<len;i++) { while(1) { for(j=0;j<len;j++) { temp=fabs((sumA-a[i]+b[j])-(sumB+a[i]-b[j])); if(temp<cha) { sumA+=b[j]-a[i]; sumB+=a[i]-b[j]; cha=temp; temp=a[i]; a[i]=b[j]; b[j]=temp; f=1; break; } } if(j>=len) break; } if(i==len-1&&f) { f=0; i=-1; } } return cha; } int main() { int a[]={100,99,98,1,2,3}; int b[]={1,2,3,4,5,40}; int c[]={1,13,20,38}; int d[]={6,7,28,29}; int cha,i; cha=smallDif(a,b,6); cout << "A,B系列元素的最小差为:" << cha<<endl; cout<< "A系列元素为"; for (i=0;i<sizeof(a)/sizeof(a[0]);i++) cout<<a[i]<< " "; cout<<endl; cout << "B系列元素为"; for (i=0;i<sizeof(b)/sizeof(b[0]);i++) cout<<b[i]<< " "; cout<<endl; cha=smallDif(c,d,4); cout << "A,B系列元素的最小差为:" << cha<<endl; cout<< "A系列元素为"; for (i=0;i<sizeof(c)/sizeof(c[0]);i++) cout<<c[i]<< " "; cout<<endl; cout << "B系列元素为"; for (i=0;i<sizeof(d)/sizeof(d[0]);i++) cout<<d[i]<< " "; cout<<endl; return 0; }