0
点赞
收藏
分享

微信扫一扫

5.3回溯法求所有子集


方法一

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. 算法图

5.3回溯法求所有子集_#include

方法二

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


举报

相关推荐

0 条评论