比如有数组{1,5,3,7,6,4,2},m = 7,
输出:1 6
3 4
7
1 2 4
2 5
这个事,我考虑了挺久的。然后在做昨天的100-21题目的时候,突然觉得貌似跟这个挺像的,然后我就顺着思路(具体思路可以看下100-21)做了下找到了方法,但是代码比较繁杂,效率不好。。不知道有什么更优化的方法没有
代码还是贴上来吧:
/*==========================================*\
这是我在学校论坛上看到有位同学,写的一个工具。
但当时,他是用python写的,没有注释和说明,实话
说,我没有看懂。但主要的功能是,有一个整数数组,
然后有一个数m,要找到整数数组中,所有和等于m的组
合,并输出。
比如有数组{1,5,3,7,6,4,2},m = 7,
输出:1 6
3 4
7
1 2 4
2 5
\*==========================================*/
#include <iostream>
#include <vector>
using namespace std;
//快排
int partition(int *index,int begin,int end){
int i = begin;
int j = end;
int temp;
while(i<j){
while(index[i]<index[j]){
--j;
}
if(i<j){
temp = index[i];
index[i] = index[j];
index[j] = temp;
}
while(index[i]<index[j]){
++i;
}
if(i<j){
temp = index[i];
index[i] = index[j];
index[j] = temp;
}
}
return i;
}
void quickSort(int *index,int begin,int end){
if(begin < end){
int q = partition(index,begin,end);
quickSort(index,begin,q-1);
quickSort(index,q+1,end);
}
}
int binaryFind(int *index,int length,int n){//二分查找
int i = 0;
int j = length -1;
while(i <= j){
int pIndex = (i+j)/2;
if(index[pIndex] > n){
j = pIndex - 1;
}else if(index[pIndex] < n){
i = pIndex + 1;
}else if(index[pIndex] == n){
return pIndex;//找到的话返回索引
}
}
return -1;//否则返回-1
}
bool FindSum(int sum, int *index , int pIndex , vector<int> &vresult)
{
bool ret = false;
if (sum<=0||pIndex<0)
return ret;
if (sum<=index[pIndex]){
int flag = binaryFind(index,pIndex+1,sum);
if(flag >= 0){
pIndex = flag;
vresult.push_back(index[pIndex]);
for (int i=vresult.size()-1;i>=0;i--){
cout<<vresult[i]<<" ";
}
cout<<endl;
vresult.pop_back();
ret = true;
}
}
vresult.push_back(index[pIndex]);
bool res1=FindSum(sum-index[pIndex],index, pIndex-1, vresult);
vresult.pop_back();
//cout << "index : " << index[pIndex] << endl;
bool res2=FindSum(sum,index, pIndex-1,vresult);
return res1||res2||ret;
}
void Find(int sum, int *index,int length)
{
vector<int> vresult;
quickSort(index,0,length-1);//先将数组排序,按从小到大的顺序,然后就跟100-21有点像了
if(!FindSum(sum,index, length-1 , vresult))
cout<<" can't get "<<sum<<endl;
}
int main(){
int index[] ={1,5,7,6,2,100};
Find(7,index,sizeof(index)/sizeof(int));
return 1;
}