P1036. 模板题_选数

考点

  • DFS

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>

using namespace std;

int arr[20], ans, K, N;

bool isprime(int x)
{
for (int i = 2; i <= sqrt(x); ++i)
if (x % i == 0)
return false;
return true;
}

void dfs(int cnt, int idx, int sum)
{
if (cnt > K)
{
if (isprime(sum))
++ans;
return;
}
for (int i = idx; i < N; ++i)
{
dfs(cnt + 1, i + 1, sum + arr[i]);
}
}

int main()
{
cin >> N >> K;
for (int i = 0; i < N; ++i)
cin >> arr[i];
dfs(1, 0, 0);
cout << ans;
return 0;
}

思路

一道DFS的模板题

为取数不重复,规定每次取数时的初始下标至少大于上一次的取数下标,就可以保证“永不回头”

由于每次只能取K个数,所以需要设立一个变量cnt来计数;如果当前cnt大于K,说明已经取够K个了,就进行质数判断然后返回