—————————————本文旨在讨论计算机知识,欢迎指正!—————————————
这是一道很基础和经典的模版题目:
首先观察题目,我们可以把实现代码分为三个主要部分:
1、主函数集成;
2、质数判断函数;
3、深搜累加函数;
于是我们可以尝试实现:
1.主函数集成:
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
dfs(1, 1);
cout << ans << endl;
return 0;
}
接下来,则是质数判断函数(这里是朴素判断,你可以试试欧拉筛更快捷)
int isprime(int x)
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)//若能整除则不是质数
{
return 0;
}
}
return 1;
}
最后,是dfs搜索函数:
void dfs(int start, int count)//start是到第x个数(a[25]数组中),count 是k个数字已经选了几个
{
if (count > k)//选完就可以判断是否合理了
{
int sum = 0;
for (int i = 1; i <= k; i++)
{
sum += arr[i];
}
if (isprime(sum)) {
ans++;
}
return;
}
for (int i = start; i <= n; i++)
{
arr[count] = a[i];
dfs(i + 1, count + 1);//因为避免选择重复数字,所以用start来当第一项
arr[count] = 0;//简单回溯
}
}
完成如此三个函数,我们的题目就完成了!
下面的是完整代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int n, k;
int ans = 0;
int a[25];//存储输出的数字
int arr[25];//存储式子内的数字
int isprime(int x)//质数判断函数
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
return 0;
}
}
return 1;
}
void dfs(int start, int count)//start是到第x个数(a[25]数组中),count 是k个数字已经选了几个
{
if (count > k)//选完就可以判断是否合理了
{
int sum = 0;
for (int i = 1; i <= k; i++)
{
sum += arr[i];
}
if (isprime(sum)) {
ans++;
}
return;
}
for (int i = start; i <= n; i++)
{
arr[count] = a[i];
dfs(i + 1, count + 1);//因为避免选择重复数字,所以用start来当第一项
arr[count] = 0;//简单回溯
}
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
dfs(1, 1);
cout << ans << endl;//输出答案;
return 0;
}
希望能对你有所帮助!