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;
    }







  • 相关阅读:
    charles 安装、破解、简单介绍
    8、postman中 转码生成python-requests接口请求代码,并定义一个获取及请求的方法
    json 序列化和反序列化(针对python数据类型)
    leetcode 35.搜索插入位置
    leetcode 27.移除元素
    js 中的数组方法
    js判断小数点后几位小数
    leetcode 15.三数之和
    leetcode 1.两数之和
    leetcode 680.验证回文字符串
  • 原文地址:https://www.cnblogs.com/csnd/p/12897068.html
Copyright © 2011-2022 走看看