P1036_选数(JAVA语言)
阅读原文时间:2023年07月08日阅读:1

已知 n 个整数x1​,x2​,…,xn​,以及1个整数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个整数(满足条件的种数)。

输入样例#1: 复制

4 3
3 7 12 19

输出样例#1: 复制

1

import java.util.*;
public class Main {
    static int ans=0;
    static Scanner in=new Scanner(System.in);
    static int n=in.nextInt();
    static int k=in.nextInt();
    static int a[]=new int[n+2];
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        for(int i=0;i<n;i++)
        {
            a[i]=in.nextInt();
        }

        dfs(0,k,0);

        System.out.println(ans);
    }
static int c=0;
    private static void dfs(int sum,int choo,int now) {
        if(n-now<choo)return;
        if(choo==0){        

            if(is_prime(sum)==1){

                ans++;
            }
            return ;
        }

            dfs(sum+a[now],choo-1,now+1);
            dfs(sum,choo,now+1);

    }

    private static int is_prime(int sum) {
        // TODO Auto-generated method stub
        if(sum==1)return 0;
        for(int i=2;i*i<=sum;i++)
            if(sum%i==0)
                return 0;
        return 1;
    }

}