【洛谷p1036】选数
(一定要声明我太蒟了,这个题扣了一上午……)
算法标签:

……
dfs真的不是我所擅长的qwq,这道题的思路其实很简单,就是先dfs搜索所有可能的和,然后判断是不是质数。说着好说,然鹅并不好写:
第一个想法是用线性筛把2—1e8之间的素数都筛出来,然后搜出一个ans后与质数表进行比较(因为毕竟感觉O(n)的快嘛)然后发现用线性筛预处理还不如直接O(根号n)的筛素数呢qwq,
所以判断是否为素数部分:
bool pan(int g){
for(int i=;i<=sqrt(g);i++)
if(g%i==) return ;
return ;
}
接下来就是我学的滑天下之大稽的dfs了qwq:
dfs里有三个量:1.记录每一次dfs代数和的sum;2.记录现在选中了几个数的cnt;3.现在选数选到的最后位置last(划重点);
last的用途:
用来保证不会出现既计算1(1)+5(3)又计算5(3)+1(1)的情况,其中(x)代表下标。last的使用方法:在dfs的for循环时,从last开始循环,到n停止,这样可以保证不会既计算1(1)+5(3)又计算5(3)+1(1)的情况(鬼知道怎么用的last)
总之很神奇,复习一下dfs:
1.常与递归同时使用;
2.一般的dfs格式:
int dfs(int k){
if(满足最终条件){
输出/储存……解;
return ;
}
for(int i=;i<=某个条件;i++){
if(满足条件){
保存结果;
dfs(下一个k);//这个k可以根据不同的题不同的解法;
回溯;//把之前修改掉的值再改回来;
}
}
}
en--------
题解:
#include<bits/stdc++.h> using namespace std; int n,k,ans;
int x[];
bool d[];//判断是否已经被计算 bool pan(int g){//判质数
for(int i=;i<=sqrt(g);i++)
if(g%i==) return ;
return ;
} int dfs(int sum,int c,int last){
if(c==k) {//如果已经选择了k个数
if(pan(sum))//判断它们的和是否为质数
ans++;//如果是,ans++
return ;//返回上一层循环
}
for(int i=last;i<=n;i++){
if(!d[i]) {//如果这个数还没有被算过
d[i]=;last++;//last++表示last之前的数已经被加过一遍了,不会被再加了
dfs(sum+x[i],c+,last);//dfs下一层
d[i]=;
}
}
return ;
} int main(){ scanf("%d%d",&n,&k); for(int i=;i<=n;i++)
scanf("%d",&x[i]); dfs(,,); cout<<ans<<endl; return ;
}
另外我要附上一段数据,不枉yky同学帮我存了一中午:
100 5
3 3 2 5 6 1 5 4 55 6 156 89 89 262 1115 5626 48 44 665 92 15 1152 62 95 4 8 11 526 59 8 46 49 26 55 2 55 4 6 54 962 11 56 655 66 898 226 1 5 41 5 56 26 4 44 668 9 454 6 21 415 1 2563 96 4 5223 2 65 1 51 8 65 2 65 3 56 126 33 256 89 415 1 6 3 558 9 11 55 66 88 9 1 2 6 66 645 46 56 5 89 64 56 4 546 4651 5646 463 45
【洛谷p1036】选数的更多相关文章
- 【搜索】【入门】洛谷P1036 选数
题目描述 已知 n个整数x1,x2,…,xn,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...
- 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举
题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...
- 洛谷 P1036 选数
嗯.... 这种类型的题在新手村出现还是比较正常的, 但是不知道为什么它的分类竟然是过程函数与递归!!!(难道这不是一个深搜题吗??? 好吧这就是一道深搜题,所以千万别被误导... 先看一下题目: 题 ...
- (水题)洛谷 - P1036 - 选数
https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...
- 洛谷P1036选数(素数+组合数)
题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...
- 洛谷——P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 【洛谷P1036 选数】
这个题显然用到了深搜的内容 让我们跟着代码找思路 #include<bits/stdc++.h>//万能头 ],ans; inline bool prime(int n)//最简单的判定素 ...
- 洛谷 P1036 选数【背包型DFS/选or不选】
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 洛谷P1036.选数(DFS)
题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...
- 洛谷P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
随机推荐
- 行人重识别(ReID) ——数据集描述 Market-1501
数据集简介 Market-1501 数据集在清华大学校园中采集,夏天拍摄,在 2015 年构建并公开.它包括由6个摄像头(其中5个高清摄像头和1个低清摄像头)拍摄到的 1501 个行人.32668 个 ...
- powerdesigner数据库设计
(1)创建物理数据模型 打开PowerDesigner,然后点击File-->New Model然后选择如下图所示的物理数据模型(物理数据模型的名字自己起,然后选择自己所使用的数据库即可) ( ...
- Linux–Nginx攻略
什么是Nginx Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的Ra ...
- 基于Redis实现简单的分布式锁【理论】
摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...
- web项目分层设计
model.dao.service.controller之间的关系,还有util和task的简介 model: 与数据库中的表一一对应,实现set和get的方法.
- springboot cache---本地缓存的使用
使用缓存的几个注解 什么时候需要使用缓存呢?一般是在一个方法的返回值需要被频繁用到.但是返回值很少改变而且执行这个方法会消耗较多的时间,这种情况我们可以考虑将返回值暂时存到内存中,需要时通过对应的唯一 ...
- 【leetcode】307. Range Sum Query - Mutable
题目如下: 解题思路:就三个字-线段树.这个题目是线段树用法最经典的场景. 代码如下: class NumArray(object): def __init__(self, nums): " ...
- laravel后台账户登录验证(5.5.48版本)
首先我是菜鸟,对laravel框架也不是很熟悉,突然有一天心血来潮就想研究一下laravel的后台登录用户登录的流程, 虽然公司项目中有这样的一套流程,也看了好几遍,越看越简单,越看我就越会了,当自己 ...
- URL跳转漏洞
URL跳转原理: 由于越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如 ...
- php随机数原理
php随机数原理: 系统自动生成一个随机数种子(mt_srand函数可以自己生成种子),mt_rand先判断是否有生成种子,没有就自动生成一个,然后根据种子生成随机数. 生成10000-99999随机 ...