递归实现指数型枚举
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> chosen;
void calc(int x){
if (x == n + 1){
for(int i = 0; i < chosen.size(); i ++)
printf("%d ",chosen[i]);
puts("");
return;
}
calc(x + 1);
chosen.push_back(x);
calc(x + 1);
chosen.pop_back();
}
int main()
{
cin >> n;
calc(1);
}
#include <iostream>
using namespace std;
// u是当前枚举到的数,state是二进制数记录哪些数被选
void dfs(int u, int state) {
if (u == n) {
for (int i = 0; i < n; i ++)
if (state >> i & 1)
cout << i + 1 << " ";
cout << endl;
return ;
}
dfs (u + 1, state); // 不用u这个数
dfs (u + 1, state | (1 << u)); // 用u这个数
}
int main() {
int n;
cin >> n;
dfs(0,0);
return 0;
}
递归实现排列型枚举
#include<iostream>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> path;
void dfs(int u,int state)
{
if(u == n){
for(auto x : path) cout << x << ' ';
cout << endl;
return ;
}
for(int i = 0; i < n; i ++){
if(!(state >> i & 1)){
path.push_back(i + 1);
dfs(u + 1,state | (1 << i));
path.pop_back();
}
}
}
int main()
{
cin >> n;
dfs(0,0);
return 0;
}
简单斐波那契
#include <bits/stdc++.h>
using namespace std;
const int N = 11;
int all[N] = {0 , 1};
int a;
void d(int n)
{
if(n == a) return ;
else
{
all[n] = all[n - 1] + all[n - 2];
}
d(n + 1);
}
int main()
{
cin >> a;
if(a == 1)cout << "0";
else if(a == 2)cout << "0 1";
else{
d(2);
for(int i = 0 ; i <a; i ++) cout << all[i] <<" ";
}
return 0;
}
这个就直接过了
递归实现组合型枚举
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int n,m;
int path[N];
void dfs(int u, int start)
{
if(u > m)
{
for(int i = 1; i <= m; i ++)
printf("%d ",path[i]);
puts("");
}
else{
for(int i = start; i <= n; i ++){
path[u] = i;
dfs(u + 1, i + 1);
path[u] = 0;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}
相关题解
还是看y总视频吧
翻硬币
原题链接
有一点地方不太明白,等大佬有时间,再问清楚吧