这道题很明显是一道dfs,但是有一个非常坑的地方就是重复,怎么讲呢?就比如:
我们先排一部分
那么如果是全排列,会怎么样呢?
是不是发现问题了,很明显的多了两个,所以他跟传统的暴力深搜不一样,这道题是一直向起点前面搜的,不会搜到起点后面的元素,那么就需要加一个变量了:起点:index
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,ans = 0;
int a[25];
bool prime(int x){
for(int i=2;i<x;i++){
if(x%i==0) return false;
}
return true;
}
void dfs(int x,int index,int res){
if(x>=k){
if(prime(res)) ans++;
return;
}
for(int i=index;i<n;i++){
res += a[i];
dfs(x+1,i+1,res);
res -= a[i];
}
return;
}
int main()
{
cin >> n >> k;
for(int i=0;i<n;i++){
cin >> a[i];
}
dfs(0,0,0);
cout << ans << endl;
return 0;
}
这里就保证了每次都向前搜,那么就保证了一定不会重复,最后写一个判断素数函数(相信大家已经砍瓜切菜了吧),然后就是套用dfs的模板即可
加油