递归实现指数型枚举
从 1∼n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 nn。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
import java.util.*;
public class Main {
public static void fbs(int n,int start,ArrayList<Integer> list){
//输出及格式,一棵主干上所有结果
if(list.size()>0){
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+(i==list.size()-1?"":" "));
}
System.out.println();
}
if(list.size()==0) System.out.println();//负责一种全不选的结果的输出
for(int i=start;i<=n;i++){
list.add(i);
fbs(n,i+1,list);//决定一棵树的另一个主干
list.remove(list.size()-1);//清理上一次的结果
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
fbs(n,1,new ArrayList<>());
}
}
//这道题可以从一棵树中梳理出思路
递归实现排列型枚举
把 1∼n1∼n 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数 nn。
输出格式
按照从小到大的顺序输出所有方案,每行 11 个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1≤n≤9
import java.util.*;
public class Main{
public static void bfs(int n,ArrayList<Integer> list,boolean[] vis){
if(list.size()==n){
for(int i=0;i<n;i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=true;
list.add(i);
bfs(n,list,vis);
vis[i]=false;//状态恢复
list.remove(list.size()-1);//返回上一层
}
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
boolean[] vis=new boolean[n+1];
bfs(n,new ArrayList<>(),vis);
}
}
//这道题其实比上一种更加的易懂简单,主要思想都是一棵树,其中boolean数组用来保存状态,通过遍历来集数。
递归实现排列型枚举:
从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
输入格式
两个整数 n,m在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1 个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7
排在 1 3 6 8
前面)。
数据范围
n>0
0≤m≤n
n+(n−m)≤25
import java.util.*;
public class Main{
public static void fbs(int n,int start,ArrayList<Integer> way,int m){
if(way.size()==m){
for(int i=0;i<way.size();i++){
System.out.print(way.get(i)+" ");
}
System.out.println();
}
for(int i=start;i<=n;i++){
way.add(i);
fbs(n,i+1,way,m);
way.remove(way.size()-1);
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
fbs(n,1,new ArrayList<>(),m);
}
}
//这道题的思路和前面的很相似,都是一棵树的深度搜索,这道题本质上是组合,并且从小到大枚举
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具