1. 程式人生 > 其它 >1317:【例5.2】組合的輸出 深搜題解

1317:【例5.2】組合的輸出 深搜題解

1317:【例5.2】組合的輸出


時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 24255 通過數: 11944

【題目描述】

排列與組合是常用的數學方法,其中組合就是從n個元素中抽出r個元素(不分順序且r≤n),我們可以簡單地將n個元素理解為自然數1,2,…,n,從中任取r個數。

現要求你用遞迴的方法輸出所有組合。

例如n=5,r=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

#include<bits/stdc++.h>
using namespace
std; const int N=25; int n,r; int path[N];//儲存路徑 bool st[N];//儲存這個數有沒有被選過 void dfs(int x){ if(x==r+1)//路徑到頭了 { for(int i=1;i<=r;i++)//輸出你的路徑 cout<<setw(3)<<path[i]; cout<<endl; return; } for(int i=1;i<=n;i++)//找出合適的數存在path {
if(i>path[x-1]&&!st[i])//數比之前的數要大,而且沒有被挑選過 { path[x]=i; st[i]=1; dfs(x+1);//遞迴去實現DFS st[i]=0;//實現後當前位沒有被選,所以清零 } } } int main() { cin>>n>>r; dfs(1); return 0; }