今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036)

是一道很经典的DFS问题

首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路!

题目描述
已知 nn 个整数 x_1,x_2,…,x_nx1​,x2​,…,xn​,以及11个整数kk(k<nk<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:

3+7+12=223+7+12=22

3+7+19=293+7+19=29

7+12+19=387+12+19=38

3+12+19=343+12+19=34。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=293+7+19=29。

输入格式
键盘输入,格式为:

n,kn,k(1 \le n \le 20,k<n1≤n≤20,k<n)

x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1​,x2​,…,xn​(1≤xi​≤5000000)

输出格式
屏幕输出,格式为: 11个整数(满足条件的种数)。

输入输出样例
输入

4 3
3 7 12 19

输出

1

读完题目,根据结果是要求种数,所以我们可以想到DFS来求解

其实这里的难点是:如何去重?

答案是:不降原则

不降原则是个神马意思呢? 来看看详细说明!

举个例子:
比如说在6里面随便选5个数,那么选法都是什么呢?
瞎枚举?
12345
12346
前两个还不会弄混
然后很可能就乱了
少点数可能不会乱
但是多了就不好整了
比如说在100里随便选50个数。
1 2 3 4 5 6 7 8 9 10 11 12......
Die.
所以我们可以运用不降原则:
保证枚举的这些数是升序排列
其实真正的不降原则还可以平
比如 1 2 2 3 3 4......
但是请注意这道题也不能平
否则就有重复数字了

拿6个里面选3个举例子
1 2 3
1 2 4
1 2 5
1 2 6
第一轮枚举完毕。
第二个数加一
1 3 ?
这个“?”应该是4,因为是升序排列
1 3 4
1 3 5
1 3 6
接着,就是这样
1 4 5
1 4 6
1 5 6
第一位是1枚举完毕
第一位是2呢?
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
就是这样的,枚举还是蛮清晰的吧
以此类推.....
3 4 5
3 4 6
3 5 6
4 5 6
然后就枚举不了了,结束。
所以说,这样就可以避免判重了。

知道了不降原则,咱们再来see see 代码

代码中还是一样的老套路
一样的dfs
一样的参数
咱们最主要看其中不降原则的部分
在dfs函数中,我们明显能看到一个参数 startx
是startx而不是start是为了避免关键字
这是个什么东西呢?
就是当前的初始值
也就是最小的,符合不降原则的参数
这样一来,就可以去重了!

好的,代码说完了,最后给个带有注释版的程序:

#include <iostream>
#include <cstdio>
using namespace std;bool isprime(int a){//判断素数/*0和1特判真的没啥用对这题吐槽:题中n的数据范围很奇怪,n还有可能=1.....那k<n......*/for(int i = 2;i * i <= a; i++)//不想用sqrt,还要头文件if(a % i == 0)//如果整除return false;//扔回false//程序都到这里的话就说明此为素数//否则就被扔回了return true;//扔回true
}int n,k;
int a[25];
long long ans;void dfs(int m, int sum, int startx){//最重要的递归
//m代表现在选择了多少个数
//sum表示当前的和
//startx表示升序排列,以免算重if(m == k){//如果选完了的话if(isprime(sum))//如果和是素数ans++;//ans加一return ;}for(int i = startx; i < n; i++)dfs(m + 1, sum + a[i], i + 1);//递归//步数要加一,和也要加//升序起始值要变成i+1,以免算重return ;//这一个步骤下,所有的都枚举完了//直接返回去
}int main(){scanf("%d%d",&n,&k);//输入for(int i = 0; i < n; i++)scanf("%d",&a[i]);//循环读入dfs(0,0,0);//调用函数printf("%d\n",ans);//输出答案return 0;//结束程序
}

深度优先搜索——选数(洛谷 P1036)相关推荐

  1. 信息学奥赛一本通 1919:【02NOIP普及组】选数 | 洛谷 P1036 [NOIP2002 普及组] 选数

    [题目链接] ybt 1919:[02NOIP普及组]选数 洛谷 P1036 [NOIP2002 普及组] 选数 [题目考点] 1.排列组合 2.深搜(子集树) 3.质数 [解题思路] 深搜(子集树) ...

  2. 深度优先搜索——单词方阵(洛谷 P1101)

    题目选自洛谷P1101 这道题也是挺不错的DFS的题,但是区别于一般的深搜, 这道题在选定一个方向后,就不能改变了! 给出我的详细思路就是: 用char a[101][101]保存输入的数据,int ...

  3. 深度优先搜索——First Step(洛谷 P3654)

    题目选自洛谷P3654 本题遍历每一个可以站人的点,然后利用dfs的思路判断每一个点向下和向右是否能满足条件:但是k=1时需要特判,因为k=1意味着向下和向右重复计算,需要除以2. 注意在dfs前先判 ...

  4. 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数

    [题目链接] ybt 1925:[03NOIP普及组]麦森数 OpenJudge NOI 4.4 1708:麦森数 洛谷 P1045 [NOIP2003 普及组] 麦森数 [题目考点] 1. 高精度 ...

  5. 信息学奥赛一本通 2007:【20CSPJ普及组】方格取数 | 洛谷 P7074

    [题目链接] ybt 2007:[20CSPJ普及组]方格取数 洛谷 P7074 [CSP-J2020] 方格取数 [题目考点] 1. 坐标型动规 [解题思路] 确定状态:a[i][j]为从起点走到i ...

  6. 洛谷 P1036 选数

    P1036 选数 题目描述 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别 ...

  7. 洛谷 - P1036 选数(递归)

    题目链接:点击查看 题目大意:给出n个数,我们需要从中选k个作为一个新的集合,问新集合的权值和有多少是素数 题目分析:这个题目考考察了两点: 判断素数 设计递归 为什么把判断素数单独列出来了呢?因为一 ...

  8. 洛谷 P1036 [NOIP2002 普及组] 选数(DFS)

    题目描述 已知 n 个整数 x1,x2,-,xnx_1,x_2,-,x_nx1​,x2​,-,xn​,以及1个整数k(k<nk<nk<n).从n个整数中任选k个整数相加,可分别得到一 ...

  9. 洛谷P1036选数(素数+组合数)

    题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...

最新文章

  1. 基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比
  2. python语言入门n-Python基础语法学习笔记
  3. COM笔记-CoCreateInstance
  4. 用实例证明dll中new的内存不能在exe中释放
  5. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]
  6. 零基础也能学会的小游戏编程!入门级别实践
  7. springmvc接收参数
  8. 华为鸿蒙系统学习笔记8-开发者生态建设
  9. 【codevs2452】【SCOI2005】【BZOJ1088】扫雷Mine
  10. Windows下VB6.0开发——关于String类型数据的思考
  11. 100天python、github_GitHub - 214929177/Python-100-Days: Python - 100天从新手到大师
  12. 经典C语言编程100例——题目+答案代码(1-10)
  13. C#创建文件,覆盖文件,读取文件
  14. Android开发中导入字体库
  15. 计算机组成原理2017答案,计算机组成原理答案2017(西南大学).docx
  16. MC基础教程#1 关于启动器
  17. 京东云主机挂载云硬盘、分区、格式化
  18. 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指
  19. 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
  20. 2021-02-03-linux命令

热门文章

  1. 用oracle的java存储过程实现BLOB字段的字符串读取
  2. php软件开发--sphinx索引静态化及伪静态
  3. 手写bind_一次搞定前端“四大手写”
  4. Spring MVC初见面
  5. 什么是 devops_DevOps对您意味着什么?
  6. 2017年大白菜系统操作说_为什么操作系统在2017年更重要
  7. qt 程序异常结束。_软件特攻队|VLC-Qt,功能齐全的跨平台多媒体开发利器
  8. 2016年广东省电子设计大赛健康电子专题——健康养殖远程监控系统(环境监控系统V1.0版本)
  9. c语言继承与派生作用,C++中继承与派生是如何实现的?
  10. mysql oracle 锁机制_Mysql锁机制