dfs每层搜索这个数要不要选就好了
#include <bits/stdc++.h>
using namespace std;
int n;
bool st[20];
void dfs(int u)
{
if(u>n)
{
for(int i=1;i<=n;i++)
if(st[i]) cout<<i<<" ";
puts("");
return ;
}
dfs(u+1);
st[u]=true;
dfs(u+1);
st[u]=false;
return ;
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
全排列dfs 每一层dfs看一下这个位置要不要选某个数
#include <bits/stdc++.h>
using namespace std;
int n;
bool st[10];
int a[10];
void dfs(int u)
{
if(u>n)
{
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
puts("");
return ;
}
for(int i=1;i<=n;i++)
{
if(st[i]) continue;
a[u]=i;
st[i]=true;
dfs(u+1);
st[i]=false;
}
return ;
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
非常简单的斐波那契额
#include <bits/stdc++.h>
using namespace std;
int f[55];
int main()
{
f[0]=0,f[1]=1,f[2]=1;
for(int i=2;i<=50;i++)
f[i]=f[i-1]+f[i-2];
int n;
cin>>n;
for(int i=0;i<n;i++)
cout<<f[i]<<" ";
puts("");
return 0;
}
组合数的枚举方式 树形枚举 根节点到叶子节点的路径都是一个方案
#include <bits/stdc++.h>
using namespace std;
int a[27];
int n,m;
void dfs(int u,int start)
{
if(u>m)
{
for(int i=1;i<=m;i++)
cout<<a[i]<<" ";
puts("");
return ;
}
for(int i=start;i<=n;i++)
{
a[u]=i;
dfs(u+1,i+1);
// a[u]=0;//写不写没关系 会被覆盖
}
}
int main()
{
cin>>n>>m;
dfs(1,1);//第一个参数为层数就是选了 多少个数 第二个参数是当前从那个数开始搜
return 0;
}
首先能操作第一个硬币的操作只能是 “ 同时操作第一个和第二个硬币 ”的操作 如果目标状态和初始状态的第一个硬币不同我们只能用这个操作 然猴再看第二个硬币如果初始和目标的状态不同 那么只能操作 “ 第二和第三个硬币 ”的操作 因为第一个硬币的状态已经确定了 不可能再去改变第一的状态 那么可以推出来状态是固定的 并且题目说一定有解 直接枚举到n-1个位置就可以出答案了
这题和提高课的一题二进制枚举很像
#include <bits/stdc++.h>
using namespace std;
const int N =110;
int res;
char start[N], aim[N];
void turn(int i)
{
if (start[i] == 'o') start[i] = '*';
else start[i] = 'o';
}
int main()
{
cin >> start >> aim;
int n = strlen(start);
for (int i = 0; i < n - 1; i ++)
{
if (start[i] != aim[i]) {
turn(i), turn(i + 1);
res ++;
}
}
cout<<res<<endl;
return 0;
}