NYOJ 32 組合數(dfs)
阿新 • • 發佈:2019-01-31
組合數
時間限制:3000 ms | 記憶體限制:65535 KB 難度:3- 描述
- 找出從自然數1、2、... 、n(0<n<10)中任取r(0<r<=n)個數的所有組合。
- 輸入
- 輸入n、r。
- 輸出
- 按特定順序輸出所有組合。
特定順序:每一個組合中的值從大到小排列,組合之間按逆字典序排列。 - 樣例輸入
-
5 3
- 樣例輸出
-
543 542 541 532 531 521 432 431 421
321
-
#include<stdio.h> #include<string.h> int m,n; int a[105],visit[105]; void dfs(int num){ if(num==m){ for(int i=0;i<num;i++) { printf("%d",a[i]); }printf("\n"); return ; } for(int i=n;i>=1;i--){ if(!visit[i]){//未標記 visit[i]=1;//標記為一 a[num]=i;//記錄i if(num==0||a[num-1]>a[num]) dfs(num+1);//保證為降序,這一行也用來執行輸出,當找到第m個數時輸出 visit[i]=0;// 標記為0,否者只能輸出5的全排列 } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ memset(visit,0,sizeof(visit)); dfs(0); } }