算法二十二:数组和之间差最小

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;

要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

例如: 

var a=[100,99,98,1,2, 3];

var b=[1, 2, 3, 4,5,40];

分析:要是序列的和之差最小,考虑将两个序列组合成一个序列1,对序列求和sum,选取一个数组,使得这个数组的和最接近sum/2,对合成序列1求和,然后取均值,再进行选取那些与这个均值最接近的序列1中的数,放入序列a中,这样可以使得数组和最近进sum/2。

代码:

MinMinus.h

#ifndef MINMINUS_CPP

#define MINMINUS_CPP

#include< iostream>;

#include< vector>;

#include <math.h>

using namespace std;

void MinMinus(int n,int c[]);

int extractmin(vector<double> ivec,vector<bool> visited);

#endif

MinMinus.cpp

#include "MinMinus.h"

void MinMinus(int n,int c[]){

vector<int> a,b;

int sum=0;

vector<double> ivec;

vector<bool> visited; 

int k;

int index=0;

double ave;

for(int i=0;i<2*n;i++){

sum += c[i];

}

ave = (double)sum/(2*n);

for(int i=0;i<2*n;i++){

ivec.push_back(c[i]-ave);

visited.push_back(false);

}

for(int i=0;i<n;i++){

k = extractmin(ivec,visited);

a.push_back(c[k]);

visited[k] = true;

}

for(int i=0;i<2*n;i++){

if(visited[i]==false){

b.push_back(c[i]);

visited[i] = true;

}

}

for(int i=0;i<n;i++){

cout<<a[i]<<"\t";

}

cout<<endl;

for(int i=0;i<n;i++){

cout<<b[i]<<"\t";

}

}

int extractmin(vector<double> ivec,vector<bool> visited){

int k;

int i;

for(i=0;(i<ivec.size())&&(visited[i]==true);i++);

k = i;

for(;i<ivec.size();i++){

if((fabs(ivec[i])<fabs(ivec[k]))&&(visited[i]==false)){

k = i;

}

}

return k;

}

猜你喜欢

转载自blog.csdn.net/huaxiawudi/article/details/84198478