深度优先搜索!!!!!
n 个数中取不超过 k 个数并将他们相加,请问有多少种不同的取法使得取出的数的和是质数

Input多组数据,第一行一个整数 T 表示数据组数(T<=5)对于每一组数据:第一行两个整数 n,k,意义如题所示(1<=n<=20,k<=n)接下来一行 n 个正整数,保证 Ai<=5000000
Output

对于每一组数据,输出一行一个整数作为答案

Sample Input
1
4 3
3 7 12 19

sample Output

6

Hint
样例解释:{3},{7},{19},{7,12},{12,19},{3,7,19}

这个题比赛时没有 ac 比赛时一直在考虑该怎样优化暴力,最后快要结束时听大佬李用dfs过了,于是结束后补一波题,相当于重新学了一波dfs
1.首先素数打表,本题 5e6 的数据,我稳妥一点直接开到 1e7;
2.第二就是最核心的部分,dfs递归运用,题中说是不超过 k 个数,所以在dfs中要罗列 1 - k,

void dfs(ll x,ll sum,ll k)
{if(isp[sum]==0)              //这里sum 为每次传进来的 a[i] 和 从a[i] 开始往后的1 - k 个数列中的数(a[i],a[i]+a[i+1],.,.,.,.,.,)ans++;if(k>=m)                 //递归的终止条件,题目中的不超过k次return;for(ll i=x+1;i<=n;i++)         //从 输入的第一个数开始,依次往后遍历{dfs(i,sum+a[i],k+1);}
}

下面是完整代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+7;
ll a[maxn];
bool isp[maxn];
int p[maxn];
int pNum=0;
ll n,m;
ll ans=0;
void prime1()
{for (int i = 2; i <= maxn; i++){if (!isp[i])p[pNum++]=i;for (int j=0;j<pNum&&i*p[j]<=maxn;j++){isp[i*p[j]]=1;if((i%p[j])==0)break;}}
}
void dfs(ll x,ll sum,ll k)
{if(isp[sum]==0)ans++;if(k>=m)return;for(ll i=x+1;i<=n;i++){dfs(i,sum+a[i],k+1);}
}
int main()
{prime1();ll t;scanf("%lld",&t);while(t--){scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){dfs(i,a[i],1);}printf("%lld\n",ans);}return 0;
}

科林明伦杯哈尔滨理工大学第九届程序设计竞赛 H 题(dfs)相关推荐

  1. 科林明伦杯哈尔滨理工大学第九届程序设计竞赛

    A氵题 B错排公式 C 不太懂卡塔兰数是啥东西,于是乎写的是一个n^2的dp,暴力打表写文件里,然后复制到代码里,然后切掉了 打表代码 #include<bits/stdc++.h> us ...

  2. “科林明伦杯” 哈工大第十届程序设计竞赛【BCDEFHJ签到】

    问题B. 减成一 题目描述 存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多少次操作,可以让所有数都变成1. 数据保证一定有解. 输入描述: 输入t,代表有t组数据.每组数据输入 ...

  3. 科林明伦杯”哈尔滨理工大学第十届程序设计竞赛B(减成1)

    科林明伦杯"哈尔滨理工大学第十届程序设计竞赛 存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多少次操作,可以让所有数都变成1. 数据保证一定有解. 输入描述: 输入t, ...

  4. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解

    "科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...

  5. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛 E 赛马 python

    "科林明伦杯"哈尔滨理工大学第十届程序设计竞赛 E 赛马 python E 好家伙 田忌赛马真就 匹配就不解释了 思路,主要咱不止一匹马 所以就最好的比 对方比这个数小的即可 所以 ...

  6. 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(12.10)

    "科林明伦杯"哈尔滨理工大学第六届程序设计团队赛 水题已去除.. B题  Time 原题链接:http://acm.hrbust.edu.cn/index.php?m=Proble ...

  7. 科林明伦杯哈尔滨理工大学第六届程序设计团队赛-Team模拟

    题目链接 题意:有三种操作,1,代表加入数字,2,代表拿出数字,3,代表撤销第i个操作 思路:正着模拟会超时,因为有无限的撤销操作需要递归到上方,所以我们先倒着把撤销的操作都标记下,然后正着模拟(不需 ...

  8. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)---全题目+题解

    文章目录 A.点对最大值 B.减成一 C.面积 D.扔硬币 E.赛马 F.三角形 G.养花 H.直线 I.字典序 J.最大值 A.点对最大值 链接:https://ac.nowcoder.com/ac ...

  9. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) F

    F 三角形 链接:https://ac.nowcoder.com/acm/contest/5758/F 来源:牛客网 小明有一根长度为a的木棒,现在小明想将木棒分为多段(每段木棒长度必须为整数), 使 ...

最新文章

  1. 七十三、Vue项目城市详细页的动态路由,Banner布局和公用图片画廊组件拆分
  2. c语言规定在一个源程序中main函数的位置是什么?
  3. 祝各位网友儿童节快乐!
  4. Sonar与jenkins集成
  5. powerpc和arm_为什么我喜欢ARM和PowerPC
  6. (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
  7. Spring @Autowird
  8. SAP License:SAP CWM功能及限制
  9. LeetCode 230二叉搜索树中第k小的元素
  10. MLN Alchemy
  11. 解决pgadmin4导入导出数据时报错 Utility file not found. Please correct the Binary Path in the Preferences dialog
  12. 电脑通过android手机上网
  13. 昭阳k20-80拆机过程
  14. python获取北京时间
  15. 目标检测经典论文——YOLOv3论文翻译:YOLOv3: An Incremental Improvement(YOLOv3:增量式的改进)
  16. 把手机自带计算机软件,怎样删除手机自带软件
  17. Atitit q2016 qb doc list on home ntpc.docx
  18. 缺氧游戏黑科技计算机,《缺氧》怎么生存?缺氧bug黑科技小技巧使用方法一览...
  19. 垃圾收集概述和垃圾收集算法(超详细介绍)
  20. oracle分析函数用途,深入探讨:oracle中row_number() over()分析函数用法

热门文章

  1. [cstc2021]wp
  2. matlab link offset,基于MATLAB教学型机器人空间轨迹仿真
  3. 汉字转拼音 - 输入汉字获取其拼音
  4. java编程自学教程笔记,大量教程
  5. ubantu系统从命令行进入桌面
  6. 网页中加入最新款百度天气预报样式代码
  7. Frida-Dexdump 脱壳工具下载使用以及相关技术介绍
  8. bzoj4453: cys就是要拿英魂!(后缀数组+单调栈+set)
  9. 赵铁安烧饼机器人_洛阳市民发明打烧饼机器人
  10. 获取中国银行网页中外汇率