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


    方法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


     

  • 相关阅读:
    链表相交
    环路检测
    lambada表达式对集合的过滤和相互转换
    lambda表达式对集合的遍历
    centos7常用命令
    小程序文件
    扫码登录
    位操作
    使用json-lib转换对象为字符串时的特殊处理
    javac 编译异常总结
  • 原文地址:https://www.cnblogs.com/byfei/p/6389829.html
Copyright © 2020-2023  润新知