zoukankan      html  css  js  c++  java
  • 洛谷P1036 选数

    题目描述

    已知 n 个整数 x1,x2,…,xn,以及一个整数 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)

    输出格式:

    屏幕输出,格式为:

    一个整数(满足条件的种数)。

    输入输出样例


    输入样例#1:

    4 3
    3 7 12 19


    输出样例#1:

    1




    WriteUp:


    本题难在递归算法,参照了众多大神的解法之后,找出了最容易理解的一种解法。


    参考AC代码:


    /*
    x : 已经选的数的个数
    
    y : 现在选到第几个数
    
    */
    
    
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    
    using namespace std;
    
    int n,k;
    int flag[21] = {0};
    int sum = 0;
    int arr[21];
    int ans = 0;
    
    int is_prime(int n)
    {
    	if(n==0 || n==1)return 0;
    	for (int i = 2 ; i <= sqrt(n) ; i++)
    	{
    		if (n%i==0)return 0;
    	}
    	return 1;
    }
    
    void search(int x , int y)
    {
    	for (int i = y ; i < n ; i++)
    	{
    		if (!flag[i])
    		{
    			flag[i] = 1;
    			sum += arr[i];
    			if (x==k)
    			{
    				if (is_prime(sum)) ans += 1 ;
    			}else{
    				search(x+1,i+1);
    			}
    			flag[i] = 0;
    			sum -= arr[i];
    		}
    			
    	}
    	return;
    }
    
    int main(void)
    {
    	scanf("%d%d",&n,&k);
    	for (int i = 0 ; i < n ; i++)
    	{
    		scanf("%d",&arr[i]);
    	}
    	search(1,0);
    	printf("%d",ans);
    	return 0;
    }







  • 相关阅读:
    water——小根堆+BFS
    P5930 [POI1999]降水/SP212 WATER
    Blue Mary的战役地图——Hash表
    Antisymmetry(反对称)——Manacher
    数论基础
    可持久化数据结构(线段树,trie树)
    20200725模拟赛5题解
    vscode 如何创建git 新分支
    mysql 把一个数据库中的表数据复制到另一个数据库中
    shrio中的用法以及配置
  • 原文地址:https://www.cnblogs.com/csnd/p/12897068.html
Copyright © 2011-2022 走看看