P1036 选数
题目描述
已知 n 个整数 x1,x2,…,xn,以及1个整数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)
输出格式:
屏幕输出,格式为: 1个整数(满足条件的种数)。
输入输出样例
输入样例#1: 复制
4 3 3 7 12 19
输出样例#1: 复制
1
思路
递归求解
从第一个数开始到最后一个数,把所有的情况找一遍且每次找 k 个数,然后判断是否为素数。
import java.util.Scanner;
public class Main {
static long[] arr = new long[25];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int k = cin.nextInt();
for(int i=0; i<n; i++){
arr[i] = cin.nextInt();
}
System.out.println(getAns(k, 0, 0, n-1));
}
/**
* @param leftNum 剩余可用数的个数
* @param newSum 目前加数总和
* @param start 寻数起始位置
* @param end 寻数终止位置
* @return
*/
private static long getAns(int leftNum, long newSum, int start, int end) {
if(leftNum == 0){
return isPrime(newSum);
}
if(start > end) return 0;
int sum = 0;
for(int i=start; i<=end; i++){
sum += getAns(leftNum-1, newSum+arr[i], i+1, end);
}
return sum;
}
private static long isPrime(long newSum) {
for(int i=2; i<=Math.sqrt(newSum); i++)
if(newSum % i == 0)
return 0;
return 1;
}
}
如有错误或不合理的地方,敬请指正~
加油!!