AcWing 93. 递归实现组合型枚举
原题链接
简单
作者:
GRID
,
2020-07-24 23:49:37
,
所有人可见
,
阅读 593
算法1
设置一个co表示当前层数,然后进行遍历,选或者不选当前的数,最后当co==m时输出结果。
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
bool st[N];
int n,m,co=0;
void dfs(int u)
{
if(co==m)
{
for(int i=1;i<=n;i++)
{
if(st[i]) printf("%d ",i);
}
printf("\n");
return;
}
for(int i=u+1;i<=n;i++)
{
st[i]=true;
co++;
dfs(i);
st[i]=false;
co--;
}
}
int main()
{
cin>>n>>m;
dfs(0);
return 0;
}
算法2
参照第一个递归输出所有排列组合的方法,每次遍历完一个节点便把其变为tue,之后遍历后面的节点,然后回溯寻找不遍历这个节点的其他选法。
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
bool st[N];
int n,m;
void dfs(int u,int k)
{
if(n-u+k<m) return;
if(k==m)
{
for(int i=0;i<n;i++)
if(st[i]) printf("%d ",i+1);
printf("\n");
return;
}
st[u]=true;
dfs(u+1,k+1);
st[u]=false;
dfs(u+1,k);
}
int main()
{
cin>>n>>m;
dfs(0,0);
return 0;
}