在競賽中,經常會有排列組合的問題,如果是全排列就會比較好實現,但是如果遇到了選數排列類型的題目就相當棘手,所以我這裏提供兩種題型的模板代碼,用DFS實現選數排列與組合
1.在n個數中選k個數,進行排列
#include<cstdio>
int n,k;
int a[100];
int t[100];//記錄已經選的數
bool vis[100];
void dfs(int step){
if(step==k){//k個數選完
for(int i=0;i<k;i++){
printf("%d",t[i]);
}
printf("\n");
return ;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=true;
t[step]=a[i];
dfs(step+1);
vis[i]=false;
t[step]=0;//回溯
}
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dfs(0);
return 0;
}
2.在n個數中選k個數,進行組合
遵循“搜索不降原則”
#include<cstdio>
int n,k;
int a[100];
int t[100];
void dfs(int step,int stratx){//startx防止重複選擇
if(step==k){
for(int i=0;i<k;i++){
printf("%d ",t[i]);
}printf("\n");
return;
}
for(int i=stratx;i<n;i++){
t[step]=a[i];//對選的數進行回溯
dfs(step+1,i+1);
}
return;//一輪選完後進行回溯;
}
int main(){
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dfs(0,0);
return 0;
}