P1036 选数 (DFS大法好!)

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层,如果没有,进入下面的循环,从刚一开始,每一层递归就已经分道扬镳!!!

发布了395 篇原创文章 · 获赞 52 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/dghcs18/article/details/104333772
今日推荐