题目:https://www.luogu.org/problemnew/show/P1036
题解:
回溯,注意不OK的条件,只能是a_i >= a_i-1排列
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int n,k;
int numBox[25];
int v[25];
int flag = 1;
int ans = 0;
bool isPrime(int a){
int sqr = (int) sqrt(a);
for(int i=2;i<=sqr;i++){
if(a % i == 0){
return false;
}
}
return true;
}
void choose(int cur,int res){
if(cur == k){
//cout << res << endl;
if(isPrime(res)){
ans++;
}
return;
}else{
for(int i=cur;i<n;i++){
int ok = 1;
for(int j=0;j<cur;j++){
if(v[j] >= i){
ok = 0;
}
}
if(ok){
v[cur] = i;
choose(cur+1,res+numBox[i]);
}
}
}
}
int main(void){
cin >> n >> k;
int tmp;
for(int i=0;i<n;i++){
cin >> tmp;
numBox[i] = tmp;
}
choose(0,0);
cout << ans;
return 0;
}