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