洛谷P1036.选数(DFS)
题目描述
已知 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)的更多相关文章
- 【搜索】【入门】洛谷P1036 选数
题目描述 已知 n个整数x1,x2,…,xn,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...
- 洛谷 P1036 选数【背包型DFS/选or不选】
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 洛谷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 选数
题目描述 已知 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选数(素数+组合数)
题目链接: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, ...
随机推荐
- 【Python学习笔记六】获取百度搜索结果以及百度返回“百度安全验证”问题解决
1.获取百度搜索结果页面主要是修改百度搜索url中的参数实现,例如查询的关键字为wd: 举例:https://www.baidu.com/s?wd=python",这样就可以查询到‘pyth ...
- maven&nexus_repository 私库搭建与使用
一.nexus仓库安装 1,http://www.sonatype.org/nexus/ 下载sso版本,免费2,tar -zxvf nexus-2.11.1-01-bundle.tar.gz3 ...
- 题解 洛谷 P3639 【[APIO2013]道路费用 】
不难想到可以\(2^k\)去枚举\(k\)条新边的选择方案,然后加入原图中的边来使图连通,用当前方案的收益去更新答案,但是这样复杂度过不去. 可以先把\(k\)条新边都连上,然后再加入边权从小到大排序 ...
- java HashMap、HashTable、ConcurrentHashMap区别
HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相 ...
- CSS3选择器用法小结
1.*通配符选择器 eg:*{margin:0;padding:0;} 2.#id选择符 ID选择器是CSS中效率最高的选择器,使用的时候要保证ID的唯一性 eg:#div{width:960px;m ...
- vue -电子时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的
背景 ElasticSearch 的使用度越来越普及了,很多公司都在使用.有做日志搜索的,有做商品搜索的,有做订单搜索的. 大部分使用场景都是通过程序定期去导入数据到 ElasticSearch 中, ...
- Day15_redis安装及配置
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 redi ...
- 使用property取代getter和setter方法
class Days(object): def __init__(self): self.__days = 0 @property def days(self):#获取函数,名字是days days ...
- PHP mysqli_rollback() 函数
关闭自动提交,做一些查询,提交查询,然后回滚当前事务: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con ...