题目
代码
这个题解方法是真的好!!!!!!
一定要仔细看一下
/*
这题主要是一个去重的dfs,而且将函数的参数设置为三个,真的无比巧妙啊
*/
#include<iostream>
#include<math.h>
using namespace std;
const int N=22;
int a[N];
int n,k;
long long ans;
int check(int x){
if(x==2)
return 1;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int m,int sum,int start){//三个参数分别表示搜寻到的层数,当前总和,开始运算的起点
/*这让我领悟到,其实dfs的参数不是固定的层数,它可以有多个参数
这表现的是列举的每一个情况的 “状态!”
就像这道题目的sum,我一直疑惑怎么才能定义一个局部变量,使得它具有局部的sum
但是,直接作为参数传递就完全可以了
*/
if(m==k+1){
if(check(sum))
ans++;
return;
}//就是判断列举是否over
for(int i=start;i<=n;i++){
dfs(m+1,sum+a[i],i+1);
/*
这里很巧妙,第二个参数直接是,sum+a[i],以此作为和
第三个参数表示要开始的地方,这个画图体会一下
每一层开始的第一个选择的参数一定是上一层层数加一的下标
*/
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(1,0,1);
cout<<ans<<endl;
return 0;
}