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

来源:互联网 发布:javascript对象构造器 编辑:程序博客网 时间:2024/05/14 08:51

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


 

0 0
原创粉丝点击