组合型枚举(递归及非递归)

93. 递归实现组合型枚举 (从1~n 中挑m个数枚举)

递归(yxc):

优解

#include<iostream>
using namespace std;

int n,m;
void dfs(int k,int sum,int state)
{
    if(sum+n-k<m) return ;  //剩下的未选个数不足m个;
    if(sum==m){
        for(int i=0;i<n;i++)
        if(state >> i & 1) printf("%d ",i+1);
        printf("\n");
        return ;
    }
    dfs(k+1,sum+1,state | 1 << k);  //注意递归顺序;
    
    dfs(k+1,sum,state);
}
int main()
{
    cin>>n>>m;  
    dfs(0,0,0);
    return 0;
}

非递归:

差解

#include<bits/stdc++.h>
using namespace std;

int n,m;
struct node {
	int stats[30];
};
bool cmp(node a,node b){
	for(int i=0;i<m;i++)
		if(a.stats[i]!=b.stats[i])
			return a.stats[i]<b.stats[i];
}
int main()
{
	cin>>n>>m;
	node ans[100000];
	int cnt=0;
	for(int i=0;i<(1<<n);i++){
		int num=0,a[30];
		for(int j=0;j<n;j++){
			if(i>>j&1) a[num++]=j+1;
		}
		if(num==m){
			for(int j=0;j<m;j++)
			ans[cnt].stats[j]=a[j];
			cnt++; 	
		}
	}
	sort(ans,ans+cnt,cmp);
	for(int i=0;i<cnt;i++){
		for(int j=0;j<m;j++){
			printf("%d ",ans[i].stats[j]);
		}
		printf("\n");
	}
	return 0;
 } 
发布了31 篇原创文章 · 获赞 2 · 访问量 1466

猜你喜欢

转载自blog.csdn.net/weixin_44851176/article/details/104184385