DFS有关的一些问题

最近下定决心了,开始转c++,之前一直用Java写算法题
P1036 [NOIP2002 普及组] 选数

本题就是从n个数字中选出r个数字,这个是经典的回溯,并且还需要选出来的这个数字是素数,这个应该如何判断呢?

#include<bits/stdc++.h>
using namespace std;
const int N=25;
int arr[N];
int n,r;
int ans;
int res;
bool prime(int n){
  if(n<=1){
    return false;}
    for(int i=2;i*i<=n;i++){
      if(n%i==0){
        return false;
      }
    }
    return true;
}
void dfs(int x,int start){
    //x是目前所在的第几层 start是开始的
     if(x>r){
        if(prime(res)){
          ans++;
        }
        return ;
     }
    for(int i=1;i<=n;i++){
      res+=arr[i];//加上当前的层
      dfs(x+1,i+1);
      res-=arr[i];
    }
}
int main(){
  cin >>n>>r;
  for(int i=1;i<=n;i++){
    cin>>arr[i];
  }
  dfs(1,1);
  cout <<ans<<endl;
}

你可能感兴趣的:(深度优先,算法)