再次来到这里,送你小小惊喜,算法有点垃圾,结果还是可以
程序代码:
#include<iostream>
using namespace std;
//穷举法
struct value
{
int v;
value *next;
};
class num
{
public:
num();
~num();
void empty();
void put(int n);
void put(int* N,int n);
const num& operator = (const num&);
value *val;
int L;
};
static num my;
const num& SUM(int* N,int L)//求出所有可能的和
{
int s=0;
num temp,result;
value *p=NULL;
my.empty();
if(L==1)
{
result.put(N,L);
my=result;
return my;
}
temp=SUM(&N[1],L-1);
my.empty();
result=temp;
result.put(N[0]);
p=temp.val->next;
while(p)
{
s=N[0]+p->v;
result.put(s);
p=p->next;
}
my=result;
return my;
}
void sort(int*& N,int n)//对最初输入的数列进行冒泡排序
{
int i=0,j=0,temp=0;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(N[j]>N[j+1])
{
temp=N[j];
N[j]=N[j+1];
N[j+1]=temp;
}
}
int main()
{
int m[100];//输入的数据
int n=0;//数据长度
int min=2000;//最终的最小值
int *N=m;
int i=0;
num Front;//存放负数的和
num End;//存放正数的和
value *F,*E;
while(cin>>m[n])
n++;
sort(N,n);
while(i<n-1)//找到最大负数的序号
{
if(m[i]<0&&m[i+1]>=0)
break;
i++;
}
if(i!=n-1)//求最小值
{
long s;
Front=SUM(&m[0],i+1);
End=SUM(&m[i+1],n-i-1);
F=Front.val->next;
while(F)
{
E=End.val->next;
while(E)
{
s=F->v+E->v;
s=s<0?-s:s;
min=min<s?min:s;
if(min==0)
break;
E=E->next;
}
if(min==0)
break;
F=F->next;
}
}
else if(m[0]>0)
min=m[0];
else
min=-m[n-1];
cout<<"min: "<<min;
return 0;
}
num::num()
{
val=new value;
val->next=NULL;
val->v=-10000;
L=0;
}
const num& num::operator = (const num& T)
{
value *p=T.val->next;
while(p)
{
put(p->v);
p=p->next;
}
return *this;
}
num::~num()
{
empty();
delete val;
}
void num::empty()
{
value *p=val->next,*pre;
while(p)
{
pre=p;
p=p->next;
delete pre;
L--;
}
val->next=NULL;
}
void num::put(int n)
{
value *pre=new value,*p=val->next,*q=val;
pre->v=n;
while(p)
{
if(p->v==n)
break;
else if(p->v>n)
{
pre->next=p;
q->next=pre;
break;
}
else
{
q=p;
p=p->next;
}
}
if(!p)
{
p=pre;
p->next=NULL;
q->next=p;
}
L++;
}
void num::put(int* N,int n)
{
int i=0;
while(i<n)
{
put(N[i]);
i++;
}
}
[
本帖最后由 nicum 于 2011-9-20 18:45 编辑 ]