https://www.luogu.com.cn/problem/P1036
- 这道题要是用dfs算法,这是我写的第一道dfs算法题,真正理解了它的意思。
#include<iostream>
using namespace std;
int tot,a[25];
int n,k;
bool prime(int n)
{
for(int i = 2;i*i <= n;i++)
if(n%i==0)
return 0;
return 1;
}
void dfs(int m,int sum,int be)
{
if(m == k&&prime(sum))//判断是否已经到了递归重点,并且满足之和为质数
{
tot++;//如果满足则递增计数器
return;//返回函数
}
for(int i = be;i <= n;i++)//每一层进行选择,这里的选择不需要一个bool数组标记
{//是否已经选取过,因为dfs函数中第三个参数保证了每次选取的起点都是不一样的,保证了不重不漏
dfs(m+1,sum+a[i],i+1);//进入下一层递归!
}
return;
}
int main()
{
cin >> n >> k;
for(int i = 1;i <= n;i++)
cin >> a[i];
dfs(0,0,1);
cout << tot;
}
为了保证不会重复,遵守序号递增原则,也就是说,可以有1,2,3,但是不能再递归中出现1,3,2,这样就可以避免他们之和6的重复!!!
在dfs方法中,首先是一个判断是否进行到了第k个数,即是否递归到了第k层,如果没有,进入下面的循环,从刚一开始,每一层递归就已经分道扬镳!!!