C语言求组合

引入

假设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;
}

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

时间: 2024-10-17 11:58:16

C语言求组合的相关文章

C语言求质数的算法

前言 上次被出了一题质数的C语言求解题目(面试),当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本: 判断 x 是否为质数,就从 2 一直算到 x-1. static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++) { array1[i - 1] = 0; } rt_uint32_t x, y = 0, z = 0; rt_uin

用c语言求ax^2+bx+c=0方程的解

用c语言求ax^2+bx+c=0方程的解.#include <stdio.h>#include <math.h>#define m 0.000001int main(){     float a,b,c,x,x2,n,q,p;     scanf ("%f%f%f",&a,&b,&c);     n=b*b-4*a*c;     if ((a<m)&&(a>-m))     {         x=(-c)/b

C语言求积分

编一个程序,求定积分. 1 #include<stdio.h> 2 int main() 3 { 4 float x,n=100000,integral=0,i; 5 for(i=0;i<100000;) 6 { 7 i++; 8 x=n*n; 9 integral+=i/x; 10 } 11 printf("%0.5f\n",integral); 12 return 0; 13 } C语言求积分

C语言求最大公约数和最小公倍数

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和

C语言——求最大公约数及最小公倍数

基本概念 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号. 最大公约数:也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数). 方法分析 最大公

C语言求x的y次方,自定义函数,自己的算法

我是一名高二中学生,初中时接触电脑,非常酷爱电脑技术,自己百度学习了有两年多了,编程语言也零零散散的学习了一点,想在大学学习计算机专业,所以现在准备系统的学习C语言,并在博客中与大家分享我学习中的心得与思路.希望大牛路过的时候指点指点. 可以说是第N次学习C语言了,都是学到数组和函数这里停止了,这次下定了决心要学完C语言,不光要学完,还要学好下面是利用自定义函数写的一个模仿pow()函数工作的一个小程序[求x的y次方] 1 #include<stdio.h> 2 3 int main(void

C语言求两个数中最大公约数

在C语言中如何求两个数的最大公约数呢?下面用三种方法进行求解. 方法一:穷举法. 先比较两个数的大小,然后找出较小数t,最后判断t为何值时两个数都能整除,此方法效率较低. 代码如下: #include<stdio.h> int main() {      int num1,num2,temp,i;      scanf("%d%d",&num1,&num2);      if(num1>num2)      {            temp=num1

C语言求10个整数中的最大值

我们知道求三个整数的最大值可以先定义三个变量来存放这三个数值,但是如果有十个,一百个,一千个,我们不可能定义那么多变量出来,没有什么意义.怎么解决呢?这个时候我们可以用一个数组来存放我们需要比较的数值,比如十个值,我们就用a[10].美观简洁高效!数据的存放解决了,下来就是比较,先定义一个变量比如:MAX来存放这十个数其中的一个值再一一进行比较就可以了,但为了方便起见,我们通常选择数组的第一个值即a[0]赋值给变量,然后依次和a[1].a[2]....顺序比较.如果MAX小于a[1]则把a[1]

C语言求两个整数的最大公约数

------------------------------------------------------------------------------------------------------ 最大公约数(又叫最大公因数):指两个或者多个整数共有约数中最大的一个.求最大公约数有多种方法,常见的有质因数分解法.短除法.辗转相除法.更相减损法.在这里本人建议使用后两种方法实现. -------------------------------------------------------