解法一:采用解向量x[]
#include<stdio.h>
#include<string.h>
#define MAXN 100
void dispasolution(int a[], int n, int x[]){ // 输出一个解
printf("{");
for(int i = 0; i < n; i++){
if(x[i] == 1)
printf("%d",a[i]);
}
printf("}");
}
void dfs(int a[], int n, int i, int x[]){
// 用回溯法求解向量x
if(i >= n)
dispasolution(a, n, x);
else{
x[i] = 0;
dfs(a, n, i+1, x); // 不选择a[i]
x[i] = 1;
dfs(a, n, i+1, x); // 选择a[i]
}
}
int main(){
int a[] = {1,2,3}; // s[0..n-1]为给定的字符串,设置为全局变量
int n = sizeof(a)/sizeof(a[0]);
int x[MAXN]; // 解向量
memset(x,0,sizeof(x)); // 解向量初始化
printf("求解结果\n");
dfs(a,n,0,x);
printf("\n");
return 0;
}
解法二:不采用解向量,直接存放获取的子集
#include<stdio.h>
#include<vector>
using namespace std;
void dispasolution(vector<int> path){ // 输出一个解
printf("{");
for(int i = 0; i < path.size(); i++){
printf("%d",path[i]);
}
printf("}");
}
void dfs(int a[], int n, int i, vector<int> path){
// 用回溯法求子集path
if(i >= n)
dispasolution(path);
else{
dfs(a, n, i+1, path); // 不选择a[i]
path.push_back(a[i]); // 选择a[i],将a[i]添加到path中
dfs(a, n, i+1, path);
}
}
int main(){
int a[] = {1,2,3}; // s[0..n-1]为给定的字符串,设置为全局变量
int n = sizeof(a)/sizeof(a[0]);
vector<int> path;
printf("求解结果\n");
dfs(a,n,0,path);
printf("\n");
return 0;
}
运行结果