題目
從 1∼n 這 n 個整數中随機選出 m 個,輸出所有可能的選擇方案。
輸入格式
兩個整數 n,m ,在同一行用空格隔開。
輸出格式
按照從小到大的順序輸出所有方案,每行 1 個。
首先,同一行内的數升序排列,相鄰兩個數用一個空格隔開。
其次,對于兩個不同的行,對應下标的數一一比較,字典序較小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。
資料範圍
n>0 ,
0≤m≤n ,
n+(n−m)≤25
輸入樣例:
5 3
輸出樣例:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
import java.util.Scanner;
public class Main {
static int n;
static int m;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();//1~n
m=sc.nextInt();//選m個
dfs(0,0,0);//(第i位,最終state狀态,num已選擇的個數)
}
private static void dfs(int cur, int state, int num) {
if(num+n-cur<m)return;//加上後面的數也不可能有m個
if(num==m) {
for (int i = 0; i < n; i++) {
if((state>>i&1)==1) {
System.out.print(i+1+" ");
}
}
System.out.println();
return ;
}
if(cur==n) return;//已經到最後一個數,還沒有選到m個數
dfs(cur+1, state|1<<cur, num+1);//這裡不可以寫num++,num+=1隻能num+1
dfs(cur+1, state, num);
}
}