AcWing 1572. 递归实现指数型枚举 II
原题链接
简单
作者:
小小蒟蒻
,
2020-07-13 22:29:25
,
所有人可见
,
阅读 609
题目如题
// 字典序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 20;
// src是源数据集
// res是结果集,结果集是源数据集的子集
vector<int> src, res;
int n;
void dfs(size_t lower, size_t upper) {
// 第一趟递归是空集
// 之后的每一趟递归得到的都是子集
for(size_t i = 0; i < res.size(); ++i)
cout << res[i] << " ";
cout << endl;
for(size_t i = lower; i < upper; ++i) {
// i == lower时,src[i - 1]非法,放行
// i != lower时,src[i - 1] != src[i]排除重复的排列
if(i == lower || src[i - 1] != src[i])
{
res.push_back(src[i]);
dfs(i + 1, upper);
res.pop_back();
}
}
return;
}
int main() {
cin >> n;
for(int i = 0, t; i < n; ++i) {
cin >> t;
src.push_back(t);
}
sort(src.begin(), src.end());
dfs(0, src.size());
return 0;
}
// 可惜是个非字典序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> a, b;
const int N = 10;
int s[N]; // 标记序列中的数是否被选取
int n;
void dfs(int u) {
int t = b.size();
if(u == n) {
for(int i = 0; i < t; i++)
cout << b[i] << " ";
puts("");
return;
}
s[u] = 1; // 标记不取
dfs(u + 1);
s[u] = 0; // 取消不取标记
// 剪枝:相邻且相等的元素并且相邻的前一个元素未被选取
if(u && a[u - 1] == a[u] && s[u - 1]) return;
b.push_back(a[u]);
dfs(u + 1);
b.pop_back();
}
int main() {
cin >> n;
for(int i = 0, t; i < n; i++) {
cin >> t;
a.push_back(t);
}
dfs(0);
sort(a.begin(), a.end());
return 0;
}