给定整数数组,输出所有和为给定整数值的子集

这是我在学校论坛上看到有位同学,写的一个工具。但当时,他是用python写的,没有注释和说明,实话说,我没有看懂。但主要的功能是,有一个整数数组,然后有一个数m,要找到整数数组中,所有和等于m的组合,并输出。
比如有数组{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;
}


转载于:https://my.oschina.net/dapengking/blog/86629

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值