93. 递归实现组合型枚举
题目链接https://www.acwing.com/problem/content/95/
题目
递归的思路
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int a[30];
bool vis[30];
void dfs(int u,int ct){
if(ct==m){
for(int i=0;i<m;i++){
cout<<a[i];
if(i!=m)
cout<<" ";
}
cout<<endl;
return ;
}
for(int i=u;i<=n;i++){
if(!vis[i]){
vis[i]=1;
a[ct]=i;
dfs(i,ct+1);
vis[i]=0;
}
}
}
int main(){
cin>>n>>m;
dfs(1,0);
return 0;
}
二进制的思路,但是超时了hh
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
int n,m;
priority_queue<string, vector<string>,greater<string>> q;
void pd(int u){
string a;
int ans=1,ct=0;
while(u){
if(u&1){
a+='0'+ans;
ct++;
}
ans++;
u>>=1;
}
if(ct==m)
{
q.push(a);
//cout<<a<<endl;
}
}
int main(){
cin>>n>>m;
for(int i=0;i<(1<<n);i++){
pd(i);
}
for(int i=0;!q.empty();i++){
string a=q.top();
q.pop();
//cout<<a<<endl;
for(int j=0;j<m;j++){
cout<<a[j];
if(j!=m-1)
cout<<" ";
}
cout<<endl;
}
return 0;
}