前言:
21考研,正在啃《算法笔记》,不论能否进复试记录一下准备路上写下的垃圾代码。
解答:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
bool hashtab[110] = { false };
int num[21] = {-1};
int ct = 0;
bool isprime(int n) {
int sq = sqrt(n);
if (n == 0 || n == 1)
return false;
else {
for (int i = 2; i <= sq; i++)
if (n % i == 0)
return false;
return true;
}
}
void comb(int done,int cur,int r,int n,int res[]) {
//done是已选入组合的数字数目,cur是当前所选数字的下标,r为一个组合中数的个数,n为数的总数,res数组保存选入的结果
if (done == r) {
int sum=0;
for (int i = 0; i < r; i++)
sum += res[i];
if (isprime(sum))
ct++;
}
else {
for(int i=cur;i<=n;i++)
if (hashtab[i] == false) {
res[done] = num[i];
hashtab[i] = true;
comb(done + 1, i, r, n,res);
hashtab[i] = false;
}
}
}
int main() {
int n, r;
while (scanf("%d%d",&n,&r)!=EOF) {
int res[21];
for (int i = 0; i < n; i++)
scanf("%d", &num[i + 1]);
comb(0, 1, r, n,res);
cout << ct << endl;
ct = 0;
}
return 0;
}