题目描述

已知 n个整数 x1,x2,…,xn,以及11个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

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

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

输入格式

键盘输入,格式为:

n,k(1≤n≤20,k<n)

x1,x2,…,xn (1<=xi ≤5000000)

输出格式

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

输入输出样例

输入

4 3

3 7 12 19

输出

1

我的分析

 根据本蒟蒻的经验,凡是遇到类似排列组合的多种可能的穷举问题,基本上都可以用暴力搜索解决。此题也不例外。不过要注意,本题先要求出由k个数构成的所有可能组合(无重复),而不是由k个数构成的所有可能排列,故与数选取的顺序无关,在进行深度优先搜索的时候,一定要注意避免重复哦(´・ω・`)



  最后,本题滴参考代码如下:

#include<iostream>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;
int n,k;
vector<int> group; //用于缓存k个数的一种组合
vector<vector<int>> groups;//保存多种组合
//质数判断函数啦,这里就不多解释了
bool isprime(int num){
if(num<=1) return 0;
for(int i=2;i<num/2;++i){
if(num%i==0) return 0;
}
return 1;
}
//深度优先搜索递归调用函数,index为本轮调用函数所新加入的数的下标
void dfs(int a[],int index){
group.push_back(a[index]);//将该数加入缓存
if(group.size()==k){
//若缓存中的数达k个,则将该种缓存组合保存
groups.push_back(group);
return;
}
//在该数加入缓存后,在该数右边继续依次搜寻下一个加入缓存的数
for(int i=index+1;i<n;++i){ 
dfs(a,i);
group.pop_back();//在进行完一次深搜后缓存也一定要记得跟着“退栈”
}
}
int main(){
cin>>n>>k;
int a[n];
for(int i=0;i<n;++i){
cin>>a[i];
}
//因为是组合数,故为了不重复,我们定义如下规则:
//按下标顺序从左到右依次遍历所有数,每次遍历到一个数后,讲其加入缓存,
//然后一定要在该数右边继续搜寻下一个加入缓存的数
//这样可以做到不重不漏
for(int i=0;i<n;++i){
dfs(a,i);
group.pop_back();
}
//计算所得的多个数组中和为质数的数组有多少个
int count=0;
for(int i=0;i<groups.size();++i){
int sum=accumulate(groups[i].begin(),groups[i].end(),0);
if(isprime(sum)) count++;
}
cout<<count<<endl;
return 0;
}

洛谷P1036.选数(DFS)的更多相关文章

  1. 【搜索】【入门】洛谷P1036 选数

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

  2. 洛谷 P1036 选数【背包型DFS/选or不选】

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

  3. 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举

    题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...

  4. 洛谷 P1036 选数

    嗯.... 这种类型的题在新手村出现还是比较正常的, 但是不知道为什么它的分类竟然是过程函数与递归!!!(难道这不是一个深搜题吗??? 好吧这就是一道深搜题,所以千万别被误导... 先看一下题目: 题 ...

  5. (水题)洛谷 - P1036 - 选数

    https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...

  6. 洛谷——P1036 选数

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

  7. 【洛谷P1036 选数】

    这个题显然用到了深搜的内容 让我们跟着代码找思路 #include<bits/stdc++.h>//万能头 ],ans; inline bool prime(int n)//最简单的判定素 ...

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

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

  9. 洛谷P1036 选数

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

随机推荐

  1. js:数组(创建、遍历、函数)

    1.数组 采用单个变量只能存储一个数据,数组能够存储多个数据,获取方式也比较简单.它是将一组数据存储在当个变量下的存储方式. 2.数组的创建 (1)new方式创建,不指定数组长度 <script ...

  2. 因为喜欢所以升级,MyStaging-3.0 继续

    我为什么维护MyStaging 目前该项目只有我一个人在维护,权当学习交流.为什么要继续维护呢,说一千道一万,还是因为喜欢,由于他的简单易用,从而促使我决定对 MyStaging 进行升级,目前 3. ...

  3. 基于python实现查询ip地址来源

    接口调用方法是在url后面直接加上IP地址. url = 'http://freeapi.ipip.net/218.192.3.42' #中文免费 url2 = 'http://ip-api.com/ ...

  4. EF批量插入太慢?那是你的姿势不对

    大概所有的程序员应该都接触过批量插入的场景,我也相信任何的程序员都能写出可正常运行的批量插入的代码.但怎样实现一个高效.快速插入的批量插入功能呢? 由于每个人的工作履历,工作年限的不同,在实现这样的一 ...

  5. element ui表格实现单选 但是单选取消会报错

    1.在el-table中添加两个事件  @selection-change="handleSelectionChange"  @current-change="choos ...

  6. iPhone截长图的方法

    iPhone手机暂没有长图截取功能,所以我们只能通过别的方式进行长图截取. (2020年4月10日更新) ios13目前可以截长图了,不过只能在Safari中进行长图截取,而且存储形式为pdf格式,下 ...

  7. python中的and与or

    一.问题起源: main=None main=main or sys.modules["__main__"].main main返回的是后面一个值,即 sys.modules[&q ...

  8. Linux系统安装Samba共享服务器详解及安装配置

    一.简介 Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享软件,实现了Linux和windows系统间的文件共享.SMB(Server Messages Block,信息服务 ...

  9. Python大礼包-安装视频+pycharm编译器|Mac版本+64位+32位版本pycharm安装包+python安装|内附网盘链接带提取码

    pycharm安装包+环境安装打包带走,附带视频教程与pdf教程. (下载链接在本文最下方) 多的不说,直接上图: Python大礼包-安装视频+pycharm编译器详细文件: 点击此处进入下载地址 ...

  10. matplotlib基础汇总_03

    四图 直方图 [直方图的参数只有一个x!!!不像条形图需要传入x,y] hist()的参数 bins 可以是一个bin数量的整数值,也可以是表示bin的一个序列.默认值为10 normed 如果值为T ...