【题目链接】

ybt 1919:【02NOIP普及组】选数
洛谷 P1036 [NOIP2002 普及组] 选数

【题目考点】

1.排列组合

2.深搜(子集树)

3.质数

【解题思路】

深搜(子集树),每次确定要不要选择某个数字。选择该数字,则加和增加,然后看下一个数字。不选择,则直接看下一个数字。如果选择的数字个数达到k个,那么看加和是不是质数,如果是,计数加1。最后输出计数。

看数据范围k,n都小于等于20,从n个数中找k个数的组合数CnkC_n^kCnk​最大值为C2010=184756C_{20}^{10}=184756C2010​=184756,可以通过深搜搜索所有可能的组合看加和为质数有多少种情况。
如果直接判断一个数是否是质数,复杂度为O(x)O(\sqrt{x})O(x​),x为待判断的数字。x的最大可以是101010个5∗1065*10^65∗106相加即5∗1075*10^75∗107,5∗107≈7∗103\sqrt{5*10^7}\approx7*10^35∗107​≈7∗103这个数再乘以184756,结果接近10910^9109。
以上只是对时间复杂度最坏情况的理论上的分析,实际每次判断质数多数情况下不会循环O(x)O(\sqrt{x})O(x​)次,应该不会超时,实际也没有超时。

【题解代码】

解法1:

#include <bits/stdc++.h>
using namespace std;
#define N 25
int n, k, x[N], sum, ct;//sum:加和
bool isPrime(int n)//判断n是不是质数
{for(int i = 2; i <= sqrt(n); ++i){if(n % i == 0)return false;}return true;
}
//看要不要选择第i个数字,现在还需要选择m个数字(深搜子集树)
void dfs(int i, int m)
{if(m == 0)//找到解,已经选择了k个数字 {if(isPrime(sum))//如果num是质数 ct++;//计数加1 return;}if(n-i+1 < m)//剪枝 若 剩余的数字个数 小于 要选择的数字个数 就退出 return;dfs(i+1, m);//第i数字不加入sum += x[i];//状态更新 dfs(i+1, m-1);//第i数字加入sum -= x[i];//状态还原
}
int main()
{cin >> n >> k;for(int i = 1; i <= n; ++i)cin >> x[i];dfs(1, k);cout << ct;return 0;
}

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

  1. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

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

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

  3. 洛谷----P1036 [NOIP2002 普及组] 选数

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

  4. 信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences

    [题目链接] ybt 1375:骑马修栅栏(fence) 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences [题目考点] 1. 图论:欧拉回路 欧拉回路存在的条件: ...

  5. 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒

    [题目链接] ybt 1314:[例3.6]过河卒(Noip2002) ybt 1921:[02NOIP普及组]过河卒 洛谷 P1002 [NOIP2002 普及组] 过河卒 [题目考点] 1. 坐标 ...

  6. 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

    [题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...

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

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

  8. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  9. 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题

    [题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...

最新文章

  1. Intellij IDEA单元测试提示Test events were not received
  2. 【视频课】图像分割重磅上新-人像抠图(Matting)实战
  3. 允许跨域访问_PHP设置多域名允许跨域访问
  4. pythonの鉴黄之路(二)——图片转base64码
  5. webrtc后续补丁
  6. C语言 游戏远程call调用,创建远程线程 调用游戏所有call
  7. 从不同解码策略看机器如何生成文本
  8. Algorithm Set:floyd判环法
  9. 【线程安全】—— 单例类双重检查加锁(double-checked locking)
  10. 微服务架构实战:Swagger规范RESTful API
  11. Python3安装Crypto模块
  12. 网页上嵌入Flash播放器(2)
  13. 下行法求最小割集案例_最小割集求法.docx
  14. Android中获取视频的第一帧图片的三种方法
  15. rabbitmq 从channal获得socket
  16. apche的log4j.properties和log4j2.xml的配置和使用
  17. 【Centos】Docker停止容器服务后,磁盘I/O仍然迟迟不下降。(未解决)
  18. VMware配置虚拟机映射,实现局域网络互相访问
  19. 国产加速度传感器QMA6100P
  20. 简单实现点击图片放大的功能

热门文章

  1. C++重载IO操作符
  2. 三种banner基础形态
  3. C# webservice调用方法总结
  4. 手把手教你做用户画像:3种标签类型、8大系统模块
  5. 清华大学计算机科学与技术在哪个楼,清华大学计算机科学与技术系宿舍
  6. java无限循环可变参数,Java可变参数、加强for循环
  7. mysql docker还是rds_容器化RDS:计算存储分离还是本地存储?
  8. 如何让手机1秒打开健康码 ,任何机型!
  9. Java程序员必备:异常的十个关键知识点
  10. 怎么样才算是精通 JavaScript?