P1036 选数

作者: Nautilus1 | 来源:发表于2017-09-11 15:00 被阅读0次

题目描述:已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。要求计算出和为素数共有多少种。
分析:要用深度搜索来做。首先要有一个判断素数的函数,深搜每次两个分支,即选或者不选此数。当选够k个数则判断和是否是素数。本例搜索树如下,左分支选此数,右分支不选,叶子是最后需要判断的数。原来一颗满二叉树通过剪枝少搜索一些。

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
int a[22], n, k, s;
bool is(int x)      //判断素数
{
    if (x == 0 || x == 1) return false;
    if (x == 2) return true;
    for( int i = 2; i * i <= x ; i++)
        if (x % i == 0)
        return false;
    return true;
}
void fun(int i, int x, int st)    //深搜,参数分别为:选到第几个数,目前加和,还要加几个数
{
    if (st == 0)               //k个数选完
    {
        if ( is(x) ) s ++;
        return;
    }
    if (n - i < st) return;            //剪枝,剩下的数已经不够选到k个
    fun(i + 1, x + a[i], st - 1);   //选此数递归
    fun(i + 1, x, st);         //不选此数递归
}
int main()
{
    int i,j;
    while(~scanf("%d %d", &n, &k))
    {
        s = 0;
        for( i = 0; i < n; i++)
            scanf("%d", &a[i]);
        fun(0,0,k);
        printf("%d\n", s);
    }
    return 0;
}

相关文章

  • P1036 选数

    题目描述:已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加...

  • 洛谷题解P1036 选数

    一、题目 https://www.luogu.org/problemnew/show/P1036 二、代码 少儿编...

  • 象数选车号

    有辆车,要选什么号码能有助于自己的身体健康呢? 这就要对先天八卦、后天八卦及五行有较深的认识。 比如身有肿瘤包块的...

  • 课程安排

    朝辉: 问好; 年龄;手指游戏,《打老虎》;手指表示数;点数报总数;按数取物;读数; 挑红色(二选一,三选一,多选...

  • 1、2、3三个数字可以组成多少个没有重复的三位数

    百位数有3种选法,十位数有2种选法,个位数有1种选法。3 x 2 x 1 = 6所以可以组成6个没有重复数字的三位数

  • 福利一一点赞用户随机送贝

    若点赞数满100,选10人送贝

  • 压力测试知识点

    知识点 步骤 设置线程数 设置循环次数 勾选持续时间(当勾选这项时,设置循环次数需要勾选永远) 断言 响应断言 响...

  • 算法专题(一)  二分法

    考虑一个问题:从1~100内选一个数,然后让别人去猜,你只会告诉他他才的数字大了或者小了,怎么去快速猜到你选的数呢...

  • 快速排序

    快速排序采用分治策略,选一个基准数,比基准数小的放在基准数的左边,比基准数大的放在右边,在对两部分数据进行快速排序...

  • 育才少儿班冲刺模拟题-心算题篇(答案与解析)③

    欢迎关注公众号:沈阳奥数 讲解小学初中奥数,谢谢大家支持。 ③ 下列分数中,最大的是哪个?选 。 A:1...

网友评论

    本文标题:P1036 选数

    本文链接:https://www.haomeiwen.com/subject/mphfsxtx.html