现在的位置: 首页 > 综合 > 正文

如何实现组合?

2013年12月05日 ⁄ 综合 ⁄ 共 1345字 ⁄ 字号 评论关闭

在实际编程时,有时会遇到这样的问题 ,我们需要列举出某个数组中所有可能的组合?比如,有这样的题目,有一个数组,我们可以从其中选择任意数量的数字,问问最后能够得到多少可能的和?

如数组A[5] = {1,2,3,4,5};

则从A中选取数字有以下情形:

1   2    3    4     5

1 2   = 3

1 3  = 4

1 4  = 5

1 5 = 6

2 3 = 5

2 4 =6

2 5 = 7

3 4 =7

3 5 = 8

4 5 =9

1 2 3 = 6               1 24 = 7              1 2 5 = 8     1 3 4 = 8  1 3 5 = 9            1  4 5 = 10

2  3 4 = 9         2  3 5 = 10             2  4  5 = 11     3  4 5 = 12

1 2 3 4 = 10   1 2 3 5 = 11    1 2 4  5 = 12   1 3  4  5 = 13   2 3 4 5 = 14   

1  2     3   4   5 = 15

程序实现如下:

#include <vector>
using namespace std;

vector< vector<int> > AllSeries; //所有可能的序列

void GetPartSeries(int nDataNum, vector<int> left, vector<int> right)
{
 if (left.size() == nDataNum)
 {
  AllSeries.push_back(left);
  return;
 }

 for (vector<int>::iterator iter = right.begin(); iter != right.end(); iter ++)
 {
  vector<int> newleft(left);
  newleft.push_back(*iter);

  vector<int> newright;

  for (vector<int>::iterator i = iter + 1; i != right.end(); i ++)
  {
   newright.push_back(*i);
  }
  GetPartSeries(nDataNum,newleft,newright);

 }
}
int main()
{
 int nDataNum = 5;
 vector<int> Left;
 vector<int> Right;
 for (int i = 0; i < 5; i ++)
 {
  Right.push_back(i+2);
 }
 GetPartSeries(5,Left,Right);
 GetPartSeries(4,Left,Right);
 GetPartSeries(3,Left,Right);
 GetPartSeries(2,Left,Right);
 GetPartSeries(1,Left,Right);

 for (vector< vector<int> >::iterator iter = AllSeries.begin(); iter != AllSeries.end(); iter ++)
 {
  vector<int> temp = *iter;

  for (vector<int>::iterator i = temp.begin(); i != temp.end(); i ++)
  {
   printf("%d   ",*i);
  }
  printf("/n");
 }
 return 0;
}

抱歉!评论已关闭.