在一个数组中找到等于某个数的组合

方法1:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include <algorithm>
#include<iostream>
using namespace std;

void getResult(vector<int> a,int result) 
{
	sort(a.begin(),a.end());
	int nLen = a.size();
	for (int i = 0; i < nLen; i++) 
	{
		if (a[i] == result)
			cout<<a[i]<<endl;
		for (int j = i + 1; j < nLen; j++) 
		{
			if (a[i] + a[j] > result)
				break;
			if (a[i] + a[j] == result)
			{
				cout<<a[i]<<"+"<<a[j]<<endl;
			} 
			else 
			{
				for (int k = j + 1; k < nLen; k++)
				{
					if (a[i] + a[j] + a[k] > result)
						break;
					if (a[i] + a[j] + a[k] == result) 
					{
						cout<< a[i]<< "+"<<a[j]<<"+"<<a[k]<<endl;
					} 
					else
					{
						for (int l = k + 1; l < nLen; l++)
						{
							if (a[i] + a[j] + a[k] + a[l] > result)
								break;
							if (a[i] + a[j] + a[k] + a[l] == result)
								cout<<a[i]<<"+"<< a[j]<< "+" <<a[k]<<"+"<<a[l]<<endl;
							//else继续,有点复杂。 
						}
					}
				}
			}
		}
	}
}

void main() 
{
	vector<int> a;
	a.push_back(11);
	a.push_back(2);
	a.push_back(3);
	a.push_back(1);
	a.push_back(4);
	a.push_back(10);
	a.push_back(23);
	a.push_back(7);
	a.push_back(8);
	a.push_back(9);
	a.push_back(6);
	a.push_back(12);
	getResult(a,10);
	system("pause");
}

 

#include <list>
#include <vector>
using namespace std;

typedef vector<double> ListD;
typedef vector<ListD> ListLD;

//	给定一个数字数组,从这个数组中找出所有的组合,使组合中各数字相加等于一个给定数值  
//	nums = 给定数组  
//	num = 给定数值
//	index = 当前操作的数字在数组中的index
//	count = 存储所有组合的可能数
//	results = 存储所有组合的情况
void NumCount(double nums[], double num, int index, int &count,  ListLD &results,int NumLen)  
{				//当前操作的数字=给定数值      
	if (nums[index] == num)      
	{          //保存此组合         
		results[results.size() - 1].push_back(nums[index]);   
		count += 1;          //清空缓存并将除了此数之外的此组合的另外的数字存入缓存里  
		ListD TmpList;
		results.push_back(TmpList);         
		for (int i = 0; i < results[results.size() - 2].size() - 1; i++)          
		{             
			results[results.size() - 1].push_back(results[results.size() - 2][i]);         
		}         
		if (index ==  - 1)         
		{          
			return;         
		}          //进入到下一递归          
		NumCount(nums, num, index + 1, count, results,NumLen);     
	}      //大于给定数,跳过此数,进入到下一次递归   
	else if (nums[index] > num)     
	{         
		if (index == NumLen - 1)        
		{            
			return;        
		}          //此组合无效,跳到下一递归   
		NumCount(nums, num, index + 1, count, results,NumLen);      
	}			//小于给定数,则保存此数至缓存之后,给定数减去此数,然后进入下一次递归,之后将此数从缓存中删除    
	else    {         
		if (index == NumLen - 1)      
		{            
			return;       
		}          
		results[results.size() - 1].push_back(nums[index]);			//给定数减去此数        
		int tempNum = num - nums[index];							//进入到下一递归          
		NumCount(nums, tempNum, index + 1, count, results,NumLen);  //将此数从缓存中删除          
		ListD::iterator itr= results[results.size() - 1].begin();  
		itr+=(results[results.size() - 1].size() - 1); 
		results[results.size() - 1].erase(itr); 
		if (index < NumLen - 1)          
		{															//再跳过过此数,给定数不变,进入到下一次递归             
			NumCount(nums, num, index + 1,count,results,NumLen);        
		}     
	}  
} 

int main()
{
	double test[10] = {1,2,3,4,5,6,7,8,9,10};
	ListLD testList;
	int a = 0,b=0;
	NumCount(test,10,a,b,testList,10);
	return 0;
}

此代码运行出错,我根据C#翻译的,原文地址

http://sumice.name/A/Index/86


 

posted @ 2014-02-20 15:19  byfei  阅读(699)  评论(0编辑  收藏  举报