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;
}
}
洛谷 P1036 选数 Java
猜你喜欢
转载自blog.csdn.net/qq_45260619/article/details/105519476
今日推荐
周排行