java 枚举组合_AcWing 93. 【java】递归实现组合型枚举

// 需要反复取的时候才要循环判断,只向后取直接把状态传下去就可以了

// 不需要所有状态空间,所以可以剪枝

import java.util.*;

import java.util.stream.*;

public class Main{

void run(){

int n = jin.nextInt();

int m = jin.nextInt();

dfs(0, n, m, 0, 0);

}

void dfs(int start, int n, int m, int sum, int status){

if (sum == m ){

buffer.clear();

for (int i = 0 ; i < n ;i ++){

if (((status >> i) & 1) == 1 ){

buffer.add(i+1);

}

}

String res = String.join(" ", buffer.stream().map(String::valueOf).collect(Collectors.toList()));

System.out.println(res);

} else if (n - start + sum >= m){

dfs(start+1, n, m, sum+1, status | (1 << start));

dfs(start+1, n, m, sum, status);

}

}

private List buffer = new ArrayList<>();

private Scanner jin = new Scanner(System.in);

public static void main(String[] args) throws Exception {new Main().run();}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值