给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合

【题目】给定一个数t以及n个整数,在这n个数中找到加和为t的所有组合,例如t = 4, n = 6,6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, 3+1, 2+2, and 2+1+1.  请设计一个高效算法实现这个需求。-----阿里2011实习生笔试题

之前只是看了一下网上这个题的写法没自己动手写,以下为自己所写的程序。

注:此题可与创新工厂的那个题目(http://blog.csdn.net/zhizunwudi/article/details/11709115)对比着看一下,两者有点不同:本题数组中数字是有限的,而创新工场的那个题目每一个数字有无限个。

int partition(int *a,int low,int high)
{
	int pivotKey=a[low];
	while(low=a[low])
			low++;
		swap(a[low],a[high]);
	}
	return low;
}

void QSort(int *a,int low,int high)
{
	if (low& vec)
{	//a为输入数组,n为数组长度,sum为待查找的和,vec用于保存查找到的组合
	if (sum==0)
	{
		vector::iterator iter=vec.begin();
		for (;iter!=vec.end();iter++)
		{
			cout<<*iter<<" ";
		}
		cout< vec;
 	int sum=10;
 	cout<<"和为"<

 

【注】:感觉对数组“排序”的作用就是为了跳过重复的数字,如果没有重复数字,完全不需要对数组进行排序。

测试1:(排序情况)
给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合_第1张图片

 

测试2:(不排序情况,前提是无重复数字)

给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合_第2张图片

 

测试3:(不跳过重复数字)

给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合_第3张图片

 

测试4:(跳过重复数字)

给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合_第4张图片

你可能感兴趣的:(笔试/面试题)