(1)如果是两个数,则可以先排序再用“夹逼”
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int>Index;
Index findSum(int arr[],int len,int sum)
{
sort(arr,arr+len);
int start = 0;
int end = len -1;
while(start<end){
if(arr[start]+arr[end]<sum){
++start;
}
else if(arr[start]+arr[end]>sum)
{
--end;
}
else{
return make_pair(start,end);
}
}
}
int main()
{
int arr[]={1,2,4,5,6};
Index id;
int sum = 11;
id = findSum(arr,5,sum);
cout<<arr[id.first]<<"+"<<arr[id.second]<<endl;
return 0;
}
(2)如果是多个数,用递归算法
#include<vector>
#include<iostream>
using namespace std;
vector<int> ivec;
void findSum(int arr[],int n,int sum)
{
//cout<<n<<endl;
if(sum<=0||n<=0)return;
if(arr[n] == sum){
vector<int>::iterator it;
for(it=ivec.begin();it!=ivec.end();++it)
cout<<*it<<"+";
cout<<arr[n]<<endl;
}
ivec.push_back(arr[n]);
findSum(arr,n-1,sum-arr[n]);
ivec.pop_back();
findSum(arr,n-1,sum);
}
int main()
{
int arr[]={1,2,4,5,6};
findSum(arr,4,12);
return 0;
}
另解1:
#include<vector>
#include<iostream>
using namespace std;
vector<int> ivec;
void findSum(int arr[],int n,int sum)
{
if(0 == sum){
vector<int>::iterator it;
for(it=ivec.begin();it!=ivec.end();++it)
cout<<*it<<" ";
cout<<endl;
return;
}
if(n==0)return; //注意一定要在这里停止
ivec.push_back(arr[n]);
findSum(arr,n-1,sum-arr[n]);
ivec.pop_back();
findSum(arr,n-1,sum);
}
int main()
{
int arr[]={1,2,4,5,6,8,7};
findSum(arr,6,12);
system("pause");
return 0;
}
另解2:
#include<vector>
#include<iostream>
using namespace std;
vector<int> ivec;
void findSum(int arr[],int n,int remain_sum,int sum)
{
if(remain_sum<0||sum<remain_sum)return;
if(remain_sum == 0){
vector<int>::iterator it;
for(it=ivec.begin();it!=ivec.end();++it)
cout<<*it<<" ";
cout<<endl;
return;
}
ivec.push_back(arr[n]);
findSum(arr,n-1,remain_sum-arr[n],sum-arr[n]);
ivec.pop_back();
findSum(arr,n-1,remain_sum,sum-arr[n]);
}
int main()
{
int arr[]={1,2,4,5,6,7,8};
int sum = 0;
for(int i=0;i<=6;i++){
sum += arr[i];//求数组的总和
}
findSum(arr,6,12,sum);//求出数组中所有和为12的数。
system("pause");
return 0;
}
上面这种解法也是参照http://blog.youkuaiyun.com/u010064842/article/details/8830611