题目描述:
排列与组合是常用的数学方法,其中组合就是从 n 个元素中抽出 r 个元素(不分顺序且 r≤n),我们可以简单地将 n 个元素理解为自然数1,2,…,n,从中任取 r 个数。
现要求你输出所有组合。
例如 n=5,r=3,所有组合为:
123,124,125,134,135,145,234,235,245,345。
输入:n,k
输出:所有的组合,每个数字占3个场宽
解题:dfs
import java.io.*;
import java.util.*;
public class Main{
static int n;
static int k;
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args){
quickin in=new quickin();
n=in.nextInt();
k=in.nextInt();
int[] ans = new int[k];
dfs(ans,0,0,0);
}
public static void dfs(int[] ans,int cur,int startx,int j){
if(cur==k){
for(int i=0;i<k;i++){
pw.printf("%3d",ans[i]);
}
pw.println();
pw.flush();
return;
}
for(int i=startx;i<n;i++){
ans[j%k]=i+1;
dfs(ans,cur+1,i+1,j+1);
}
return;
}
}
class quickin{
BufferedReader br;
StringTokenizer st;
quickin(){
br = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext(){
while(st==null||!st.hasMoreElements()){
try{
st=new StringTokenizer(br.readLine());
}catch(Exception e){
return false;
}
}
return true;
}
String next(){
if(hasNext()) return st.nextToken();
return null;
}
int nextInt(){
return Integer.parseInt(next());
}
}