21xrx.com
2024-12-22 22:42:56 Sunday
登录
文章检索 我的文章 写文章
C++实现组合
2023-07-11 00:20:14 深夜i     --     --
C++语言 组合算法 排列组合问题 循环结构 递归实现

组合是数学中的一个重要概念,在实际生活中也有广泛应用。如何在C++中实现组合呢?

首先,我们需要了解组合的定义。组合是指从n个不同元素中取出m个元素(不考虑顺序),所得到的不同的组合数目。其中,n和m都是非负整数,并且n>=m。

在C++中,我们可以使用递归来实现组合的计算。具体地,我们可以定义一个递归函数combine,该函数接受三个参数:n、m和start,分别表示在n个元素中取出m个元素的组合,以及从哪个元素开始取。

函数的返回值是一个vector >类型的二维向量,表示所有可能的组合。在函数中,我们首先判断特殊情况,即当m等于0或者m等于n时,返回一个空向量或者一个包含所有元素的向量。

然后,我们定义一个空的二维向量result,用于存储所有的组合。接着,我们循环从start到n-m+1的所有元素,对于每个元素,都可以把它放入组合中,或者不放入组合中。如果把它放入组合中,那么我们递归调用combine函数,传入参数n-1、m-1和i+1,表示从剩下的n-1个元素中取出m-1个元素,并从当前位置i+1开始取。在递归返回时,我们把当前元素加入组合并将其保存到result中。

如果不把当前元素放入组合中,则我们只需要递归调用combine函数,传入参数n-1、m和i+1,表示从剩下的n-1个元素中取出m个元素,并从当前位置i+1开始取。在递归返回时,我们不需要把当前元素加入组合。

当循环结束后,我们返回result中存储的所有组合,这样就完成了整个组合的计算过程。

下面是一个示例代码实现:


vector<vector<int>> combine(int n, int m, int start) {

  vector<vector<int>> result;

  

  if (m == 0) {

    result.push_back({});

    return result;

  }

  

  if (m == n) {

    vector<int> temp;

    for (int i = 1; i <= n; i++) {

      temp.push_back(i);

    }

    result.push_back(temp);

    return result;

  }

  

  for (int i = start; i <= n - m + 1; i++) {

    for (auto& temp : combine(n - 1, m - 1, i + 1)) {

      temp.insert(temp.begin(), i);

      result.push_back(temp);

    }

  }

  

  return result;

}

int main() {

  int n = 5;

  int m = 3;

  vector<vector<int>> result = combine(n, m, 1);

  for (auto& temp : result) {

    for (auto& num : temp)

      cout << num << " ";

    

    cout << endl;

  }

  return 0;

}

在上面的示例代码中,我们通过调用combine函数来计算从1到5中取出3个元素的组合,并输出所有可能的结果。运行结果如下:

1 2 3

1 2 4

1 2 5

1 3 4

1 3 5

1 4 5

2 3 4

2 3 5

2 4 5

3 4 5

可以看到,我们成功地实现了组合的计算,并得到了正确的结果。因此,递归是一种很好的实现组合的方法,可以用于解决多种实际问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复