递归实现指数型枚举
我们以n=2 为例
我们每次都有选和不选两种 方案,对于每个数字
核心代码
tatic void dfs(int u) { // u代表当前处理的数字
if (u > n) { // 终止条件:处理完所有数字
for (int i = 1; i <= n; i++) { // 遍历所有数字
if (nums[i]) { // 如果选中则输出
System.out.print(i + " ");
}
}
System.out.println(); // 换行
return; // 返回上一层递归
}
// 不选当前数字u
nums[u] = false; // 标记不选
dfs(u + 1); // 处理下一个数字
// 选当前数字u
nums[u] = true; // 标记选中
dfs(u + 1); // 处理下一个数字
}
完整代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
public class Main {
static boolean st[] ;
static int a[] ;
static int n ;
public static void main(String[] args) {
// TODO Auto-generated method stub
n =in.nextInt();
// 初始化
st =new boolean [n+1];
a = new int[n+1];
for(int i=1; i<=n ;i++) {
a[i] = i; ;
}
dfs(1);
out.close();
}
static void dfs(int u ) {
if(u>n) {
for(int i=1; i<=n ;i++) {
if(st[i]) {
out.print(i+" ");
}
}
// 换行
out.println();
// 回溯
return;
}
st[u]= false;
dfs(u+1);
st[u]= true;
dfs(u+1);
}
//快读模板
static FastReader in=new FastReader();
static PrintWriter out = new PrintWriter(System.out);
static class FastReader{
static BufferedReader br;
static StringTokenizer st;
public FastReader() {
// TODO Auto-generated constructor stub
br =new BufferedReader(new InputStreamReader(System.in));
}
String next() {
String str ="" ;
while(st==null||!st.hasMoreElements()) {
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
st=new StringTokenizer(str);
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}