選k個數的排列與組合用搜索實現

在競賽中,經常會有排列組合的問題,如果是全排列就會比較好實現,但是如果遇到了選數排列類型的題目就相當棘手,所以我這裏提供兩種題型的模板代碼,用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;
} 

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章