https://www.luogu.org/problem/P1036
#include<bits/stdc++.h> using namespace std; int n,k,arr[25]; long long ans=0; bool vis[25]; bool zs(int a) { //判断是不是质数 for(int i=2; i*i<=a; i++) if(a%i==0) return false; return true; } void dfs(int x,int sum,int z) { //x表示当前相加的数字的个数 sum表示相加的和 z表示下角标 if(x==k&&zs(sum)) { ans++; return ; //那一层进入到这里的,就返回哪一层 } for(int i=z; i<n; i++) { if(vis[i]) continue; vis[i]=true; dfs(x+1,sum+arr[i],i+1); //在这里不能用x++ vis[i]=false; } return ; } int main() { cin>>n>>k; for(int i=0; i<n; i++) { cin>>arr[i]; } dfs(0,0,0); cout<<ans; return 0; }
原文:https://www.cnblogs.com/QingyuYYYYY/p/11638849.html