递归实现指数型枚举
题目
从(1~n)的整数中随机选取多个并输出可能的选择方案
code
int n;
vector<int> chosen;
void calc(int k) {
if (k == n + 1) {
for (int i = 0; i < chosen.size(); ++i)
write(chosen[i]), putchar(' ');
putchar('\n');
return ;
}
calc(k + 1);
chosen.push_back(k);
calc(k + 1);
chosen.pop_back();
}
int main() {
read(n);
calc(1);
return 0;
}
递归实现组合型枚举
题目
从(1~n)中选取m个数输出可能的方案
code
int n;
int m;
vector<int> chosen;
void cal(int k) {
if (chosen.size() > m || chosen.size() + (n - k + 1) < m) {
return ;
}
if (k == n + 1) {
for (int i = 0; i < chosen.size(); ++i) {
write(chosen[i]), putchar(' ');
}
puts("");
}
// cout << "111111" << endl;
chosen.push_back(k);
cal(k + 1);
chosen.pop_back();
cal(k + 1);
}
int main() {
read(n); read(m);
if (m == 0) return 0;
cal(1);
// cout << "1111" << endl;
return 0;
}
递归实现排列型枚举
题目
把(1~n)这几个数拍成一行后随机打乱次序,并输出可能的方案。
code
int n;
int num[maxn];
bool used[maxn];
void cal (int k) {
if (k == n + 1) {
for (int i = 1; i <= n; ++i) {
write(num[i]), putchar(' ');
}
puts("");
return ;
}
for (int i = 1; i <= n; ++i) {
if (!used[i]) {
num[k] = i;
used[i] = true;
cal(k + 1);
used[i] = false;
num[k] = 0;
}
}
}
int main() {
read(n);
cal(1);
return 0;
}