int sum(int* arr, int count)
{
int sum=0;
for(int i=0;i<count;++i)
sum+=arr[i];
return sum;
}
int MinArrayDis(int* a, int* b, int count)
{
if(a==NULL || b==NULL || count<=0)
return -1;
bool have=false;
while(true)
{
int suma=sum(a,count);
int sumb=sum(b,count);
int sub=suma-sumb;
int i=0;
int j=0;
for(i=0; i<count; ++i)
{
for(j=0; j<count; ++j)
{
int subij=a[i]-b[j];
if(subij*sub>0 && abs(subij)<abs(sub))
{
have=true;
break;
}
}
if(have)//如果已经存在则跳出
break;
}
if(have)
{
int temp=a[i];
a[i]=b[j];
b[j]=temp;
}
else
break;
have=false;//还原have的值
}
return sum(a,count)-sum(b,count);
}
int _tmain(int argc, _TCHAR* argv[])
{
int push[6]={100,99,98,1,2,3};
int pop[6]={1,2,3,4,5,40};
copy(push,push+6,ostream_iterator<int>(cout," "));
cout<<endl;
copy(pop,pop+6,ostream_iterator<int>(cout," "));
cout<<endl;
cout<<arraydis(push,pop,6)<<endl;
copy(push,push+6,ostream_iterator<int>(cout," "));
cout<<endl;
copy(pop,pop+6,ostream_iterator<int>(cout," "));
cout<<endl;
getchar();
return 0;
}
这个算法不能保证获得最优解。
还有一种方法为遍历所有C(2n,n)的组合。找出小于等于sum/2的n个数相加最大值。
int maxsum=0;
void Divide_Recu(int* a, int count, bool* assis, int curindx, int curcount, int sum, int cursum)
{
if(curcount==count/2 && cursum<=sum/2)
{
if(cursum>maxsum)
{
maxsum=cursum;
for(int i=0;i<count;++i)
{
if(assis[i]==true)
cout<<a[i]<<" ";
}
cout<<endl;
}
}
if(curcount<count/2 && cursum<sum/2 && curindx<count)
{
assis[curindx]=false;
Divide_Recu(a,count,assis,curindx+1,curcount,sum,cursum);
assis[curindx]=true;
Divide_Recu(a,count,assis,curindx+1,curcount+1,sum,cursum+a[curindx]);
assis[curindx]=false;
}
else
return;
}
int Divide(int* a, int count)
{
if(a==NULL || count<0 || count%2==1)
return -1;
if(count==0)
return 0;
maxsum=0;
bool* assis=new bool[count];
memset(assis, 0, sizeof(bool)*count);
Divide_Recu(a, count,assis,0, 0, sum(a, count), 0);
delete []assis;
}
int temp[14]={100,99,98,1,2,3,1,2,3,4,5,40,12,25};
Divide(temp,14);