posts - 56,  comments - 32,  views - 1851

递归实现指数型枚举

从 1n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 nn

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1n15

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<>());
    }
}
//这道题可以从一棵树中梳理出思路

递归实现排列型枚举

把 1n1∼n 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 nn

输出格式

按照从小到大的顺序输出所有方案,每行 11 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1n9

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数组用来保存状态,通过遍历来集数。

递归实现排列型枚举:

从 1n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式

两个整数 n,m在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n>0
0mn
n+(nm)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);
    }
}
//这道题的思路和前面的很相似,都是一棵树的深度搜索,这道题本质上是组合,并且从小到大枚举

 

posted on   fafrkvit  阅读(0)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示