码迷,mamicode.com
首页 > 编程语言 > 详细

C语言求组合

时间:2020-02-07 18:23:57      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:int   UNC   names   ++   out   array   namespace   space   组合   

引入

假设5个数 1 2 3 4 5,选3个数求组合。可以按如下思路来考虑

  1. 先选取1,从生下的2 3 4 5中选2个求组合,这是一个递归过程
  2. 先选取2,从 3 4 5中选2个求组合,仍旧是一个递归过程
  3. 选取3,从 4 5中选2个求组合
  4. 遇到4,剩下的数字只有1个,不能再选取2个,因此不用继续考虑

定义递归_comb(array, visit, int l, int k)
其中visit是一次递归过程中选取的标记,l是子数列的开始下标,k是需要选取的个数

代码

#include <iostream>
#include <queue>
#include <vector>
#include <functional>

using namespace std;

void _comb(vector <int> &array, vector <int> &visit, vector <vector <int>> &result, int l, int k)
{
    visit[l] = 1;

    if(k == 1) {
        vector <int> tmp;

        for(int i=0; i<visit.size(); i++) {
            if(visit[i]) {
                tmp.push_back(array[i]);
            }
        }

        result.push_back(tmp);
        visit[l] = 0;
        return;
    }

    for(int i=l+1; i<array.size() && (l+k) <= array.size(); i++) {
        _comb(array, visit, result, i, k-1);
    }

    visit[l] = 0;
}

void comb(vector <int> &array, vector <vector <int>> &result, int k)
{
    int n = array.size();
    vector <int> visit;

    visit.resize(n);
    for(int i=0; i<n; i++) {
        visit[i] = 0;
    }


    for(int i=0; i<n; i++) {
        _comb(array, visit, result, i, k);
    }
}

int main(void)
{
    vector <int> array;
    vector <vector <int>> result;

    for(int i=0; i<5; i++) {
        array.push_back(i+1);
    }

    comb(array, result, 2);

    for(int i=0; i<result.size(); i++) {
        for(int j=0; j<result[i].size(); j++) {
            cout << result[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

C语言求组合

标签:int   UNC   names   ++   out   array   namespace   space   组合   

原文地址:https://www.cnblogs.com/joechow/p/12273838.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!