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