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
    搜索
    屠龙宝刀 点击就送

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    bool vis[21];
    int ans,k,n,x[21];
    int pd(int k)
    {
        for(int j=2;j*j<=k;++j)
        if(k%j==0) return 0;
        return 1;
    }
    void read(int &x)
    {
        x=0;int f=1;
        char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+(int)ch-48;ch=getchar();}
        x=x*f;
    }
    void dfs(int pos,int sum,int siz)
    {
        if(siz==k)
        {
            if(pd(sum))
            ans++;
            return ;
        }
        for(int i=1;i<=n;++i)
        {
            if(!vis[i]&&i>pos)//没被访问,并且从下一个开始搜索
            {
                vis[i]=1;
                dfs(i,sum+x[i],siz+1);
                vis[i]=0;
            }
        }
    }
    int main()
    {
        read(n);
        read(k);
        for(int i=1;i<=n;++i)
        read(x[i]);
        dfs(0,0,0);
        cout<<ans;
        return 0;
    }
    
    
    
    
    
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    性能测试之-响应时间
    性能测试之-分类
    CSS 的基础语法
    linux之-mysql数据库约束3
    linux之-mysql数据库2
    linux安装mysql
    反向树状数组
    曼哈顿最小生成树
    最小生成树的性质
    CSA Round 84 Growing Trees
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6416901.html
Copyright © 2011-2022 走看看