C++ 程序生成所有可能的子集,每个子​​集恰好有 k 个元素

c++server side programmingprogramming更新于 2024/10/25 2:59:00

这是一个 C++ 程序,用于生成所有可能的子集,每个子​​集恰好有 k 个元素。

算法

开始
   function PossibleSubSet(char a[], int reqLen, int s, int currLen, bool check[], int l):
   如果 currLen > reqLen
   返回
   否则,如果 currLen = reqLen
     然后打印新生成的序列。
   如果 s = l
      然后返回没有剩余元素。
      对于每个索引,有两个选项:
         要么以 ‘true’ 为起点,然后递归调用 PossibleSubSet()
          并将 ‘currLen’ 和 ‘s’ 的值递增。
         或者以 ‘false’ 为起点,然后递归调用 PossibleSubSet()
          仅将 ‘s’ 的值递增。
结束

示例

#include<iostream>
using namespace std;
void PossibleSubSet(char a[], int reqLen, int s, int currLen, bool check[], int l)
//打印给定数组集的所有可能组合
{
   if(currLen > reqLen)
   return;
   else if (currLen == reqLen) {
      cout<<"\t";
      for (int i = 0; i < l; i++) {
         if (check[i] == true) {
            cout<<a[i]<<" ";
         }
      }
      cout<<"\n";
      return;
   }
   if (s == l) {
      return;
   }
   check[s] = true;
   PossibleSubSet(a, reqLen, s + 1, currLen + 1, check, l);
   //使用递增的‘currLen’和‘s’值递归调用PossibleSubSet()。
   check[s] = false;
   PossibleSubSet(a, reqLen, s + 1, currLen, check, l);
   //使用仅递增的‘s’值递归调用PossibleSubSet()。
}
int main() {
   int i,n,m;
   bool check[n];
   cout<<"输入元素数量:";
   cin>>n;
   char a[n];
   cout<<"\n";
   for(i = 0; i < n; i++) {
      cout<<"输入"<<i+1<<"个元素:";
      cin>>a[i];
      check[i] = false;
   }
   cout<<"\n输入所需子集的长度:";
   cin>>m;
   cout<<"\n给定数组集的长度 <<m<<" 的可能组合:\n";
   PossibleSubSet(a, m, 0, 0, check, n);
   return 0;
}

输出

输入元素数量:7
输入 1 个元素:7
输入 2 个元素:6
输入 3 个元素:5
输入 4 个元素:4
输入 5 个元素:3
输入 6 个元素:2
输入 7 个元素:1
输入所需子集的长度:6
给定数组集的长度为 6 的可能组合:
7 6 5 4 3 2
7 6 5 4 3 1
7 6 5 4 2 1
7 6 5 3 2 1
7 6 4 3 2 1
7 5 4 3 2 1
6 5 4 3 2 1

相关文章