我觉得比较好的方法:
对原始数据排序。将第一个数依次选举。然后在其后面求两个数的和为特定值的问题。复杂度为O(n^2)
参考代码:
#include<iostream>
#include<vector>
using namespace std;
int Num[]={1,2,3,4,5,6,7,8,9,10};
int Len=10;
void find1(int *num,int result,int len)
{
int i,j,k;
for(i=0;i<len-2;i++)
{
for(j=i+1;j<len-1;j++)
{
for(k=j+1;k<len;k++)
{
if ( num[i]+num[j]+num[k] == result)
{
cout<<num[i]<<"+"<<num[j]<<"+"<<num[k]<<"="<<result<<endl;
}
}
}
}
}
int total=0;
void find2(int *num, int start, int result,int len, int count)
{
if(count==1)
{
int i;
for(i=start;i<len;i++)
{
if(num[i]==result)
{
total++;
}
}
}
else
{
if(start<len-count+1) //判断第i个数是否在结果中。
{
find2(num,start+1,result-num[start],len,count-1);
find2(num,start+1,result,len,count);
}
}
}
int total3=0;
void find3(int *num,int start,int result,int len,int count)
{
int i;
if(count==1)
{
for(i=start;i<len;i++)
{
if(num[i]==result)
total3++;
}
}
else
{
if(start<len)
for(i=start;i<len;i++)
{
find3(num,i+1,result-num[i],len,count-1); //指从第i个数开始。
}
}
}
vector<int> temp;
vector< vector<int> > result;
int total4=0;
void find4(int *num,int R,int len,int count)
{
int i;
for(i=0;i<len;i++) //每个数依次可以访问
{
int size =result.size();
int j;
for(j=0;j<size;j++)
{
vector< vector<int> >::iterator p=result.begin();
temp=p[j];
temp.push_back(num[i]);
result.push_back(temp);
}
vector<int> T;
T.push_back(num[i]);
result.push_back(T);
}
vector< vector<int> >::iterator p=result.begin();
for(p;p!=result.end();p++)
{
if(p->size()==count)
{
temp=*p;
int sum=0;
vector<int>::iterator q=temp.begin();
for(q;q!=temp.end();q++)
sum+=*q;
if(sum==R)
total4++;
}
}
}
int total5=0;
void func(int *num,int start,int len,int result) //要求已排序,且没有相同的数字
{
int *p=num+start;
int *q=num+len-1;
while(p<q)
{
if(*p + *q <result)
p++;
else if(*p + *q >result)
q--;
else
{
total5++;
p++;
q--;
}
}
}
void find5(int *num,int len, int result)
{
int i;
for(i=0;i<len-2;i++)
{
func(num,i+1,len,result-num[i]);
}
}
int main()
{
find1(Num,14,10);
cout<<"##################"<<endl;
find2(Num,0,14,10,3);
cout<<total<<endl;
find3(Num,0,14,10,3);
cout<<total3<<endl;
find4(Num,14,10,3);
cout<<total4<<endl;
find5(Num,10,14);
return 0;
}