目录
递归实现指数型枚举
题目描述
分析:
所有可能,只会选与不选
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static int n;
static int []st=new int [16];//用来存状态1表选上0表没选上
public static void main(String[] args) throws IOException {
n=Integer.parseInt(br.readLine());
dfs(1);
}
private static void dfs(int u) {
if(u>n) {
for(int i=1;i<=n;i++) {
if(st[i]==1) {
System.out.print(i+" ");
}
}
System.out.println();
}
else {
//不选
st[u]=2;
dfs(u+1);
st[u]=0;
//选
st[u]=1;
dfs(u+1);
st[u]=0;
}
}
}
递归实现排列型枚举
题目:
分析:
用个布尔型数组记录是否枚举,再存下来记录即可
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* boolean全局默认false
* int 全局默认0局部默认随机
*/
public class Main {
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static int N=10;
static int n;
static boolean []used=new boolean [N];//用来存状态是否被使用
static int []st=new int [N];//用来存状态
public static void main(String[] args) throws IOException {
n=Integer.parseInt(br.readLine());
dfs(1);
}
public static void dfs(int u) {
if(u>n) {
for(int i=1;i<=n;i++) {
System.out.print(st[i]+" ");
}
System.out.println();
}
else {
for(int j=1;j<=n;j++) {
//没有被使用
if(!used[j]) {
used[j]=true;
st[u]=j;
dfs(u+1);
//恢复状态
used[j]=false;
st[u]=0;
}
}
}
}
}
递归实现组合型枚举
题目
分析:
这种n个数选m个数的全排列需要dfs两个参数
代码:
/*
* 要实现不重复就要保证每次选择的数比前一次大
* 真的狗
*/
import java.util.Scanner;
public class Main {
static int n,m;
static int way[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
way=new int[m+1];
dfs(1,1);
}
private static void dfs(int u, int start) {
/*
* 剪枝 排除一些不可能的情况 可以提升速度
* 比如n=5,m=3,第一个是4或者5的都要排除
* 选第u个数,说明已经选了u-1个数
* 从start开始说明还可以选n-start+1个数
* 如果u-1+n-start+1<m说明不够选
* return提前退出
*/
if((u-1+n-start+1)<m) return;
if(u>m) {
for(int i=1;i<=m;i++) {
System.out.print(way[i]+" ");
}
System.out.println();
return;//真狗
}
for(int j=start;j<=n;j++) {
way[u]=j;
dfs(u+1, j+1);
way[u]=0;
}
}
}