DFS+递归
对于数组num[n]
num[0], num[1], num[2], num[3], …,num[n-4], num[n-3], num[n-2], num[n-1]
对于题目给出的K,理解为有K个座位需要填补
使用递归思想:
sum=sum+num[i]//i的范围应该是p~n-left
num[0], num[1],...,num[m], num[m+1],...,num[m+k-1-left],...,num[p],...,num[n-left], num[n-left+1],...,num[n-1]
|___________K个座位,其中有left个空位______| 要填补left个空位,从下标p~n-left中选择,直到left为0
递归出口显然为left==0,此时应该判断是否为素数
#include<bits/stdc++.h>
using namespace std;
int n,k,cnt;
int num[25];
int Prime(int n)
{//判断素数
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return 0;
return 1;
}
void dfs(int sum, int p, int left){
if (!left){
if (Prime(sum))
cnt++;
}else{
for (int i=p; i<=n-left; i++)
dfs(sum+num[i],i+1,left-1);
}
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>num[i];
}
dfs(0,0,k);
cout<<cnt;
}