/*
参数设置:什么在变化,就把什么设置成参数
void dfs()
{
if (到达终点状态)
{
…//根据题目书写内容
return;
}
if (越界或者不合法状态)
return;
if (特殊状态)//剪枝
return;
for (扩展方式)
{
if (扩展方式所达到状态合法)
{
修改操作;//根据题意来添加
标记;
dfs();
(还原标记);
//是否还原根据题意
}
}
}*/
//一、dfs全排列
#include<iostream>
using namespace std;
int n;
int p[10] = { 0 };
bool vis[10] = { 0 };
void dfs(int x);
//变化内容:填数的位置在变化
int main()
{
while (cin >> n)
{
dfs(1);
}
return 0;
}
void dfs(int x)
{
if (x == n + 1)
//1.到达终点状态
{
for (int i = 1; i <= n; i++)
cout << p[i] << " ";
cout << endl;
//1.1根据题意书写内容
return;
} //1.2返回
//2.越界或者不合法状态直接return(在这个题中没有)
//3.特殊状态进行剪枝处理(假定要求顺序输出的话)
for (int i = 1; i <= n; i++)
//4.根据题意拓展
{
//if (i > p[x])return;这么填写就错了,一般情况下要返回,但考虑不到后面的情况了
if (vis[i] = false && i>p[x])
//4.1拓展方式合法
{
p[x] = i;
vis[i] = true;
//4.2标记
dfs(x + 1);
vis[i] = false;
//4.3还原标记(是否还原根据题意,加上即回溯)
}
}
}
//二、组合+判断素数
#include<iostream>
using namespace std;
int n, k ,ans=0;
int num[100];
bool isprime(int n)
{
if (n <= 1)
return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return false;
return true;
}//判断素数
void dfs(int index, int nowk, int nowsum);
//1.状态定义:当前数,规定选择数,当前和这三个变化量
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> num[i];
dfs(0, 0, 0);
//从最初的状态开始处理
cout << ans << endl;
}
void dfs(int index, int nowk, int nowsum)
{
if (index == n + 1 || nowk == k + 1)
return;
//2.边界条件
if (index == n && nowk == k)
//3.终点
{
//3.1根据题意写相应代码
if (isprime(nowsum))
{
ans++;
}
return;
}
dfs(index + 1, nowk + 1, nowsum + num[index]);//选择当前数
dfs(index + 1, nowk, nowsum); //不选当前数
}
06-10
403
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)