P1036 选数---java

题目描述

已知 nnn 个整数 x1,x2,…,xnx_1,x_2,…,x_nx1​,x2​,…,xn​,以及111个整数kkk(k<nk<nk<n)。从nnn个整数中任选kkk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3n=4,k=3,444个整数分别为3,7,12,193,7,12,193,7,12,19时,可得全部的组合与它们的和为:

3+7+12=223+7+12=223+7+12=22

3+7+19=293+7+19=293+7+19=29

7+12+19=387+12+19=387+12+19=38

3+12+19=343+12+19=343+12+19=34。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=293+7+19=293+7+19=29。
输入格式

键盘输入,格式为:

n,kn,kn,k(1≤n≤20,k<n1 \le n \le 20,k<n1≤n≤20,k<n)

x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1​,x2​,…,xn​(1≤xi​≤5000000)
输出格式

屏幕输出,格式为: 111个整数(满足条件的种数)。
输入输出样例
输入 #1

4 3
3 7 12 19

输出 #1

1
import java.util.Scanner;

public class P1036 {
    private static int n;
    private static int k;
    private static int num;
    private static int count;
    private static int[] arrayList;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        k = sc.nextInt();
        if (n >= 1 && n <= 20 && k < n) {
            arrayList = new int[n];
            for (int i = 0; i < n; i++)
                arrayList[i] = sc.nextInt();
        }
        doSearch(1, -1);
        System.out.println(count);
    }

    static void doSearch(int x, int y) {
        if (x > k) {
            if (isPrime(num))
                count++;
            return;
        }
        for (int i = y + 1; i < n; i++) {
            //找数
            num += arrayList[i];
            doSearch(x + 1, i);
            //回溯
            num -= arrayList[i];
        }
    }

    private static boolean isPrime(int num) {
        if (num <= 1 || Math.sqrt(num) == (int) Math.sqrt(num))
            return false;
        for (int i = 2; i < Math.sqrt(num); i++) {
            if (num % i == 0)
                return false;
        }
        return true;
    }

}

你可能感兴趣的:(洛谷)