题目简述:
从N个整数中选择K个数求和,求出和为素数的组合数。
个人思路:
题中给了20组数据,直接暴力DFS,注意DFS的时候用每次选的数据往后再选,比如第一次选的3,后面可以选7,12,19,选完之后继续往后选以此类推。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
long long a[25] = {};
int ans = 0,n,k;
int judge(int x){ //素数
int y;
// cout << x << endl;
y = (int)sqrt(x);
for(int i = 2;i <= y;i++){
if(x%i == 0){
return 1;
}
}
return 0;
}
void DFS(int now,int sum,int cnt) //深搜
{
if(judge(sum) == 0&&cnt == k){
ans ++;
return ;
}
for(int i = now;i < n;i++){
DFS(i + 1,sum + a[i],cnt + 1);
}
}
int main()
{
cin >> n >> k;
for(int i = 0;i < n;i++){
cin >> a[i];
}
DFS(0,0,0);
cout << ans;
return 0;
}