题目链接:https://www.luogu.org/problemnew/show/1036
题目描述:
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34。
现在,要求你计算出和为素数共有多少种。(n <=20)
分析:因为n <= 20, 所以暴力即可。
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define mst(a,b) memset(a,b,sizeof(a))
#define For(i, k, j) for(int i = (k); i <= (j); i++)
#define INF 2147483647/3
#define ll long long
using namespace std;
inline int read()
{
int num = 0, flag = 1;
char c=' ';
for(;c>'9'||c<'0';c=getchar()) if(c=='-') flag = -1;
for(;c>='0'&&c<='9';num=(num<<1)+(num<<3)+c-48,c=getchar());
return num * flag;
}
#define N 25
int a[N];
bool p[N];
int n, k;
int ans = 0;
inline bool isprime(int a) {//质数判断
if(a == 1) return 0;
if(a == 2 || a == 3) return 1;
if(a%6 != 1 && a%6 != 5) return 0;
int g = sqrt(a);
for(int i = 5; i <= g; i += 6) {
if(!(a%i)|| !(a%(i+2))) return 0;
}
return 1;
}
void dfs(int s) {//暴力搜索
if(s == n + 1) {
int sum = 0;
For(i, 1, n) {
if(p[i]) sum++;
}
if(sum == k) {
sum = 0;
For(i, 1, n) {
if(p[i]) sum += a[i];
}
if(isprime(sum)) {
ans++;
}
}
return;
}
p[s] = 1;
dfs(s + 1);
p[s] = 0;
dfs(s + 1);
}
int main()
{
n = read(), k = read();
For(i, 1, n) {
scanf("%d", &a[i]);
}
dfs(1);
printf("%d\n", ans);
return 0;
}
说实话,我已经快一个月没有打深搜了,居然还可以一遍过。