洛谷 P1036 选数 Java

import java.util.Scanner;

class Main{
    static int k;
    static int n;
    static int[] nums;
    static long res = 0; //存储质数的个数
    public static void main(String[] rags){

        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        k = sc.nextInt();
        nums = new int[n+1];
        for (int i = 1 ; i <= n ; i++)
        {
            nums[i] = sc.nextInt();
        }
        dfs(0,0,1);//数组是从1开始存了,所以这里的第三个参数设置为1
        System.out.println(res);
    }			  //三个参数: 
    			  // m : 当前是第m个数  
    			  //sum: 1~m个数的和
    			  //startx: 当前开始的下标(从哪个数开始加)
    public static void dfs(int m , int sum ,int startx){
        if (m == k)  // 当m==k的时候,说明已经够k个数了,判断是否是质数
        {
            if (isPrime(sum))
            {
                res++;
            }
            return;
        }
        /*  假设n = 5 , k = 3
	  递归: 下标从startx开始 向后开始递归
	               dfs(0,0,1)
	             /        \
	dfs(1,nums[1],2)        ...
	          /    \...	 \
      dfs(2,nums[1]+nums[2],3)     ...
               /	 \...	    \
    dfs(3,nums[1]+nums[2]+nums[3],4)  ... 
    这个时候就已经够三个数,所以对sum判断是否为质数。

	*/
        for (int i = startx ; i <= n ; i++)
        {
            dfs(m+1,sum+nums[i],i+1);
        }
    }
    public static boolean isPrime(int num)//判断质数
    {
        for (int i = 2 ; i <= Math.sqrt(num) ; i++)
        {
            if (num % i == 0)
            {
                return false;
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45260619/article/details/105519476