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


    [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 kk<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 kk<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
    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算法和判断素数才可以解出来这道题。

  • 相关阅读:
    ES单节点部署
    设计模式:中介者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
    C++设计模式之单例模式
    Qt5开发从入门到精通——第七篇二节( 图形视图——QSlider类)
    软考高级系统架构设计师系列之:可靠性设计
    如何把文件从本地上传云服务器
    Go 语言中的map和内存泄漏
    只听过 Python 做爬虫?不瞒你说 Java 也很强
    通过共享网络使树莓派4联网
    Java中会出现内存泄漏吗
  • 原文地址:https://blog.csdn.net/m0_60630094/article/details/127705495