题目描述
已知 n 个整数 x1,x2,…,xn,以及一个整数 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)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。
、、这个题要注意的一点,是组合不是排列,深搜的时候要注意
我有过将结果标记的傻想法,我怕是个傻子,不同的组合也可以有相同的结果啊
组合的话,只需在上一个之后寻找就行了,就避免重复查找(即排列)的问题
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N,k,ans,sum;
static int[] a;
static boolean[] book;
static boolean check(int m){//素数判断
if(m==1||m==0) return false;
int n=(int)Math.sqrt(m);
for(int i=2;i<=n;i++){
if(m%i==0)
return false;
}
return true;
}
static void dfs(int index,int bag){
if(index==k){//k个数,判断素数
if(check(sum)==true)
ans++;
return;
}else{
for(int i=bag;i<N;i++){//从上一个被选中的数字之后选择数字组合,避免排列重复
if(book[i]==false){
book[i]=true;
sum+=a[i];
dfs(index+1,i+1);
sum-=a[i];//这里要注意,把尝试的数字减去
book[i]=false;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
k=sc.nextInt();
a=new int[N+1];
book=new boolean[N+1];
Arrays.fill(book, false);
for(int i=0;i<N;i++)
a[i]=sc.nextInt();
ans=0;
sum=0;
dfs(0,0);
System.out.println(ans);
}
}