【搜索】【入门】洛谷P1036 选数
题目描述
已知 n个整数x1,x2,…,xn,以及1个整数k(k<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。
例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=3
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29
输入输出格式
输入格式:
键盘输入,格式为:
n,k(1≤n≤20,k<n)
x1,x2,…,xn(1≤xi≤5000000)
输出格式:
屏幕输出,格式为:1个整数(满足条件的种数)。
输入输出样例
4 3
3 7 12 19
1
1.首先要说说如何判断质数,判断质数最通俗易懂的办法就是:
对于一个小于num的正整数x,如果num不能整除x,则num必然不能整除num/x (num = num/x * x)。反之相同。我们又知num =√num*√num。 如果n除以大于√num的数,必得到小于√num的商,而小于√num的整数已经在2到√num的整数试过了,因为就没有必要再试(√num, num)范围内的数了。代码如下:
注:经常会看到别人说“一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)”。这句话是错误的。举一个例子,16的因子包括了1、2、4、8,但很明显8>√16。另外,因子跟因数是不一样的,因数还会包括数本身,如16的因数为1、2、4、8、16。
所以我们可以这样实现:
#include<cstdio>
#include<cmath>
bool ask(int x)
{
for (int i = 1 ; i <= sqrt(x) ;i ++){
if(x % i == 0){
return 0;
}
}
return 1;
}
2。由于这个题的n非常小只有20,我们考虑搜索直接暴力。
分析题意可知本题适合用深搜。
深搜代码如下:
void dfs(int step ,int sum,int cnt)
{//step为总次数,sum为当前所选数的总和 cnt为当前选的数
if(step == n+ || cnt == k){
if(cnt == k && ask(sum)){
ans ++;
}
return;
}
dfs(step + ,sum +a[i],cnt+); //选择下一个数
dfs(step + ,sum ,cnt) //不选择下一个数
return;
}
总代码:
#include <cstdio>
#include <cmath>
int n,k;
int ans;
const int N = ;
int K[N];
bool ask(int x)
{
for (int i = ;i <= sqrt(x);i ++){
if(x % i == ){
return ;
}
}
return ;
}
void dfs(int step,int sum,int cnt)
{ if((step == (n + ) )|| (cnt == k)){
if (ask(sum) && cnt == k){
ans ++;
}
return;
}
dfs(step+,sum + K[step],cnt +);//选择下个数的情况
dfs(step+,sum,cnt); //不选择下个数的情况
return;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&k);
for (int i = ;i <= n; i ++){
scanf("%d",&K[i]);
}
dfs(,,);
printf("%d",ans);
// fclose(stdin);
// fclose(stdout);
return ;
}
【搜索】【入门】洛谷P1036 选数的更多相关文章
- 洛谷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.选数(DFS)
题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...
- 洛谷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 选数【背包型DFS/选or不选】
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
随机推荐
- POJ1027 The Same Game
题目来源:http://poj.org/problem?id=1027 题目大意: 题目说的就是现在蛮流行的手机小游戏popstar,求用贪心方法能得到多少分. 小球有三种颜色:R/G/B.横向.纵向 ...
- Luogu P2455 [SDOI2006]线性方程组 真•高斯消元板子
果然如Miracle学长所说...调了一天...qwq..还是过不了线下的Hack upd after 40min:刚刚过了 就是多了一个判无解的操作... 当系数都为0,且常数项不为0时,即为无解. ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- opencv——IplImage结构
一.作业要求: 采用MATLAB或opencv+C编程实现.每一题写明题目,给出试验程序代码,实验结果图片命名区分并作出效果比对,最后实验总结说明每一题蕴含的图像处理方法的效果以及应用场合等. 采用M ...
- windows 2012 r2 x64 安装IIS注意事项
详细安装可以参考下面; https://jingyan.baidu.com/article/93f9803f234eade0e46f559f.html 下面只说一些注意事项,如果项目要用到wcf 的话 ...
- ORACLE将查询的多条语句拼在一个字段下
select listagg(字段名,'分隔符') within group (order by 某个字段)
- 安卓usb数据接收
之前在论坛里面求助了关于监听数据接收的问题,因为第一次做这方面,可能我提的问题太简单了,大神都不愿意回答我,(之前的帖子)晚上FQ浏览网站发现问题的解决办法, 原文是:最近老板让弄安卓和一块板子通信, ...
- 面向对象设计与构造:oo课程总结
面向对象设计与构造:OO课程总结 第一部分:UML单元架构设计 第一次作业 UML图 MyUmlInteraction类实现接口方法,ClassUnit和InterfaceUnit管理UML图中的类和 ...
- 一、Spring-Data-Jpa 初体验(基于SpringBoot)
闲话少说,首先动起来(基于springboot+gradle): 1.引入依赖 dependencies { compile 'org.springframework.boot:spring-boot ...
- html标签补充
<body>内常用标签 1.<div>和<span> <div></div> : <div>只是一个块级元素,并无实际的意义.主 ...