AcWing 93. 递归实现组合型枚举
原题链接
简单
作者:
Bug-Free
,
2019-12-07 15:02:38
,
所有人可见
,
阅读 2304
//! 保持升序, 是一个局部的属性, 只要保证每次新加的数大于前一个数
//! a1<a2 a2<a3
//! 从前往后, 依次枚举每个位置是 多少
//! 核心想一下dfs是哪些参数
//! 三个位置 way[]
//! 当前该枚举哪个位置 start 中间位置就是 strat从前一个位置 +1
//! 当前最小可以从哪里枚举
//! 无非 选或不选 或者组合类型枚举(参数多一些,但是数组少了一个) 排列型枚举需要一个判重枚举
#include <iostream>
using namespace std;
const int N = 3e1;
int n, m;
int way[N];
void dfs(int u, int start)
{
if(u + n - start < m) return;
if(u == m + 1)
{
for(int i = 1; i <= m; i++) printf("%d ", way[i]);
puts("");
return;
}
for(int i = start; i <= n; i++)
{
way[u] = i;
dfs(u + 1, i + 1);
way[u] = 0;
}
}
int main()
{
scanf("%d%d", &n, &m);
dfs(1, 1);
return 0;
}
请问一下way[u] =0这里为什么需要写呢,不恢复现场也可以吧
wa了啊大佬
已经改正
这个输出后面好像多了两个0
n改成m for(int i = 1; i <= m; i++) printf(“%d “, way[i]);
if(u + n - start < m) return;
是什么优化呀?把后面的数都选上都到不了m个的话, 就直接return
明白,谢谢