当前位置:   article > 正文

【洛谷题解】P1036 [NOIP2002 普及组] 选数_洛谷p1036

洛谷p1036

[NOIP2002 普及组] 选数

题目描述

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

3 + 7 + 12 = 22 3+7+12=22 3+7+12=22

3 + 7 + 19 = 29 3+7+19=29 3+7+19=29

7 + 12 + 19 = 38 7+12+19=38 7+12+19=38

3 + 12 + 19 = 34 3+12+19=34 3+12+19=34

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

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

输入格式

第一行两个空格隔开的整数 n , k n,k n,k 1 ≤ n ≤ 20 1 \le n \le 20 1n20 k < n k<n k<n)。

第二行 n n n 个整数,分别为 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn 1 ≤ x i ≤ 5 × 1 0 6 1 \le x_i \le 5\times 10^6 1xi5×106)。

输出格式

输出一个整数,表示种类数。

样例 #1

样例输入 #1

4 3
3 7 12 19
  • 1
  • 2

样例输出 #1

1
  • 1

提示

【题目来源】

NOIP 2002 普及组第二题

思路

        这道题又是真题不过感觉和上次讲的扫雷游戏差距还是比较大(难道后来题目简单了?)这道题要使用DFS算法来解,再加上素数的判断,才可以解出来。n是否是素数判断方法:

  • 如果小于2,返回FALSE
  • 如果大于二,循环2到根号n,如果有数字能被整除,返回FALSE,如果没有,返回TRUE。
    判断代码:
int sushu(int b){
	int i;
	if(b<2)
		return 0;
	for(i=2;i*i<=b;i++)
		if(b%i==0)
			return 0;
	return 1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

DFS传送门
DFS是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

C语言AC代码

#include<stdio.h>
int n,k,a[25],t;
int sushu(int b){
	int i;
	if(b<2)
		return 0;
	for(i=2;i*i<=b;i++)
		if(b%i==0)
			return 0;
	return 1;
}
void dfs(int num,int sum,int j){
	int i;
	if(num==k){
		if(sushu(sum))
		t++;
		return;
	}
	for(i=j;i<n;i++)
		dfs(num+1,sum+a[i],i+1);
	return;
}
int main(){
	int i;
	scanf("%d %d",&n,&k);
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	dfs(0,0,0);
	printf("%d",t);
	return 0;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

总结

        难度相较于之前有一些提升,需要使用DFS算法和判断素数才可以解出来这道题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/756658
推荐阅读
相关标签
  

闽ICP备14008679号