题目传送门:P1036 [NOIP2002 普及组] 选数
题目考点为深度优先搜索。
既然要搜索,要有dfs函数,搜索每一个数。这道题不需要写回溯代码,只需要判断然后是否加上可能性即可.。
题目中要判断素数,就写一个判断是否为质数的函数:
int check(int c){
for(int i=2;i*i<=c;i++){
if(c%i==0)return false;
}
return true;
}
搜索部分(dfs):
void dfs(int cnt,int sum,int kk){
//cnt为搜索到第几个数
//sum为当前几个数加起来的和
//kk为层数(去重)
if(cnt==k+1){
if(check(sum))ans++;
return;
}
for(int i=kk;i<=n;i++){
dfs(cnt+1,sum+a[i],i+1);//往下搜
}
return;
}
代码
#include <bits/stdc++.h>
using namespace std;
int n,k,a[25],ans=0,c;
int check(int c){
for(int i=2;i*i<=c;i++){
if(c%i==0)return false;
}
return true;
}
void dfs(int cnt,int sum,int kk){
if(cnt==k+1){
if(check(sum))ans++;
return;
}
for(int i=kk;i<=n;i++){
dfs(cnt+1,sum+a[i],i+1);
}
return;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1,0,1);
cout<<ans;
return 0;
}