P1036 选数(DFS)
题目 https://www.luogu.org/problemnew/show/P1036
思路
搜索,使用递归实现dfs,所有数字遍历一遍,当取遍所有数组的index(扫了一遍,并非一定是选取了),判断是否取了要求个数的输入和是否是素数
AC代码
#include<cstdio>
#include<cmath>
using namespace std;
int in[22];
int ans=0;
int n, k;
bool isprim(int num) {
for (int i = 2; i <= sqrt(num); i++)
if (num % i == 0)
return false;
return true;
}
//传递当前选择的数的下标,传递已选择数的个数,以选择的数的总和
void dfs(int cur, int cnt, int num) {
if (cur == n-1) {
if (cnt==k&&isprim(num)) {
ans++;
}
return;
}
dfs(cur+1,cnt,num);//不拿
dfs(cur+1,cnt+1,num+in[cur+1]);//拿
}
int main() {
// freopen("E:\\下载\\testdata (1).in","r",stdin);
scanf("%d%d", &n, &k);
for (int i = 0; i <= n-1; i++)
scanf("%d", &in[i]);
dfs(-1, 0, 0);
printf("%d", ans);
return 0;
}
稍微优化
#include<cstdio>
#include<cmath>
using namespace std;
int in[22];
int ans=0;
int n, k;
bool isprim(int num) {
for (int i = 2; i <= sqrt(num); i++)
if (num % i == 0)
return false;
return true;
}
//传递当前选择的数的下标,传递已选择数的个数,以选择的数的总和
void dfs(int cur, int cnt, int num) {
if (cur == n) {
if (cnt==k&&isprim(num)) {
ans++;
}
return;
}
//第一个结点从这开始
if((k-cnt)>(n-cur))//剩下的不足以满足cnt=k时
return;
dfs(cur+1,cnt,num);//不拿
dfs(cur+1,cnt+1,num+in[cur+1]);//拿
}
int main() {
// freopen("E:\\下载\\testdata (1).in","r",stdin);
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &in[i]);
dfs(0, 0, 0);
printf("%d", ans);
return 0;
}
我的收获
dfs()参数可以为index,数量,聚合函数这个样子
P1036 选数(DFS)的更多相关文章
- 洛谷P1036.选数(DFS)
题目描述 已知 n个整数 x1,x2,-,xn,以及11个整数k(k<n).从n个整数中任选k个整数相加,可分别得到一系列的和.例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部 ...
- luogu P1036 选数 x
P1036 选数 题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别 ...
- NOIP 2002提高组 选数 dfs/暴力
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...
- 【搜索】【入门】洛谷P1036 选数
题目描述 已知 n个整数x1,x2,…,xn,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...
- (递归)P1036 选数
#include<stdio.h>#include<math.h>int x[20],n,k,i; //判断是否质数 int isprime(int n){ for(i= ...
- 洛谷 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 $太大了 ...
随机推荐
- python的一些常用函数
1 filter(function, iterable) 等价于(item for item in iterable if function(item)) 就是说,filter会遍历iterable中 ...
- Swing手动进行最大化最小化
首先jdk的setExtendedState是有bug的,需要先重载JFrame的setExtendedState方法 /** * Fix the bug "jframe undecorat ...
- Ubuntu 安装Consolas字体
下载 YaHei.Consolas https://code.google.com/p/uigroupcode/downloads/list 安装 1.创建文件夹 sudo mkdir -p /usr ...
- 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)
利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...
- 【POJ 1470】 Closest Common Ancestors
[题目链接] 点击打开链接 [算法] 离线tarjan求最近公共祖先 [代码] #include <algorithm> #include <bitset> #include ...
- [转] 本地项目上传github (新项目 / 旧项目)
前置:安装Git Bash,在github上新建仓库repository 1.右键点击项目所在文件夹,运行: git bash here.在git bash窗口运行命令 git init 把这个目录变 ...
- 函数bsxfun,两个数组间元素逐个计算的二值操作
转自http://www.cnblogs.com/rong86/p/3559616.html 函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间 ...
- matlab进入指定目录
cd C:\Users\hui\Desktop\minepy\1\minepy-1.2.0\minepy-1.2.0\matlab
- ECMA里面的一元符
只能操作一个值的叫做一元操作符.一元操作符是ECMAScript中最简单的操作符 1.递增和递减操作符 递增和递减操作符直接借鉴自c,而且各有俩个版本,前置型和后置型.顾名思义,前置型就是位于要操作的 ...
- 整数类型c++
数据类型 定义标识符 占字节数 数值范围 数值范围 短整型 short [int] 2(16位) -32768-32767 -215-215-1 整型 [long] int 4(32位) -21474 ...