给定 n
个整数和一个整数 k
, 你可以从中选择 k
个整数, 现在,要求你计算出和为素数共有多少种。
样例
给定 a=[3,7,12,19], k=3
, 返回 1
解释:
有4种方案
3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34, 只有 29 是素数.
给定 a=[1,2,3], k=2
, 返回 2
解释:
有3种方案
1 + 2 = 3 1 + 3 = 4 2 + 3 =5
只有3和5是素数
注意事项
n
不超过 1010k
不超过 n
解题思路:
与Lintcode 152. 组合类似,只不过加了素数的判断逻辑。
public class Solution {
/**
* @param a: the n numbers
* @param k: the number of integers you can choose
* @return: how many ways that the sum of the k integers is a prime number
*/
public int getWays(int[] a, int k) {
// Write your code here
dfs(a, k, new ArrayList<Integer>(), 0);
return res;
}
int res = 0;
private void dfs(int[] a, int k, List<Integer> list, int index){
if(list.size() == k){
int tmp = 0;
for(int i=0; i<list.size(); i++)
tmp += list.get(i);
if(isPrime(tmp)){
res++;
}
return;
}
for(int i = index; i < a.length; i++){
list.add(a[i]);
dfs(a, k, list, i + 1);
list.remove(list.size() - 1);
}
}
private boolean isPrime(int num){
for(int i=2; i<=Math.sqrt(num); i++)
if(num % i == 0)
return false;
return true;
}
}