方法一
1.解题思路
不选择a[i]元素 => 下一个状态为(i+1,x[i]=0)
选择a[i]元素 => 下一个状态为(i+1,x[i]=1)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10
void dispasolution(int a[], int n, int x[]) {
cout << "{";
for(int i = 0; i < n; i++)
if(x[i] == 1)
cout << a[i];
cout << "}";
}
void dfs(int a[], int n, int i, int x[]) {
if(i >= n)
dispasolution(a, n, x);
else {
x[i] = 0; // 不选择a[i]
dfs(a, n, i + 1, x);
x[i] = 1; // 选择a[i]
dfs(a, n, i+ 1, x);
}
}
int main() {
int a[] = {1, 2, 3};
int n = sizeof(a) / sizeof(a[0]);
int x[MAXN];
memset(x, 0, sizeof(x)); // 解向量初始化为0
cout << "求解结果";
dfs(a, n, 0, x);
return 0;
}
2. 算法图
方法二
1. 解题思路:求所有子集可以采用vector容器path直接存放获取的子集
#include<bits/stdc++.h>
using namespace std;
void dispasolution(vector<int> path){
cout << "{";
for(int i = 0; i < path.size(); i++){
cout << path[i];
}
cout << "}";
}
void dfs(int a[], int n, int i, vector<int> path){
if(i >= n)
dispasolution(path);
else{
dfs(a, n, i + 1, path);
path.push_back(a[i]);
dfs(a, n, i + 1, path);
}
}
int main(){
int a[] = {1, 2, 3};
int n = sizeof(a) / sizeof(a[0]);
vector<int> path;
cout << "求解结果";
dfs(a, n, 0, path);
cout << endl;
}