1. 程式人生 > >nyoj 32 組合數(dfs)

nyoj 32 組合數(dfs)

描述
找出從自然數1、2、… 、n(0< n< 10)中任取r(0< r<=n)個數的所有組合。

輸入
輸入n、r。
輸出
按特定順序輸出所有組合。
特定順序:每一個組合中的值從大到小排列,組合之間按逆字典序排列。
樣例輸入
5 3

樣例輸出
543
542
541
532
531
521
432
431
421
321

簡單dfs,主要是思維!

#include<iostream>
#include<cstring>
using namespace std; int n,m,vis[15]; void dfs(int x,int k) //x表示當前最小的數,k表示當前階段數字的個數 { if(k==m) //如果當前階段數字的個數等於m了,便列印結果 { for(int i=n;i>=1;i--) if(vis[i]) //結果用vis[]陣列儲存,從大到小輸出 cout<<i; cout<<endl; return
; } for(int i=n;i>=1;i--) { if(vis[i]||i>x) continue; vis[i]=1; dfs(i,k+1); vis[i]=0; } } int main() { while(cin>>n>>m) { memset(vis,0,sizeof(vis)); for(int i=n;i>=m;i--) //從n到m { vis[i]=1
; dfs(i,1); vis[i]=0; } } return 0; }