选数
2024年11月15日大约 1 分钟教学文档回溯与分支限界-dfs
[NOIP2002 普及组] 选数
题目描述
已知 个整数 ,以及 个整数 ()。从 个整数中任选 个整数相加,可分别得到一系列的和。例如当 ,, 个整数分别为 时,可得全部的组合与它们的和为:
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:。
输入格式
第一行两个空格隔开的整数 (,)。
第二行 个整数,分别为 ()。
输出格式
输出一个整数,表示种类数。
样例 #1
样例输入 #1
4 3
3 7 12 19
样例输出 #1
1
提示
【题目来源】
NOIP 2002 普及组第二题
我的代码
import java.util.*;
public class Main{
public static int n,k,arr[],ans=0;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
k=sc.nextInt();
arr=new int[n+1];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
dfs(0,0,0);
System.out.println(ans);
return;
}
public static boolean isprime(int x){
if(x==1)return false;
for(int i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return true;
}
public static void dfs(int t,int m,int start){
if(t==k){
if(isprime(m)){
ans++;
}
return;
}
for(int i=start;i<n;i++){
dfs(t+1,m+arr[i],i+1);
}
return;
}
}
