选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;
} 

在这里插入图片描述

发布了160 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/105394866