洛谷1036 选数
#include<iostream>
using namespace std;
const int N = 21;
int a[N];
int n, k;
long long res;
int ifprime(int a)//素数判断
{
for(int i = 2; i * i <= a; i ++)//也可用sqrt,头文件#include<math.h>
{
if(a % i == 0) return 0;
}
return 1;
}
void dfs(int m, int sum, int st)
{
//m为已选数字的个数,sum为已选数字的和 ,st为每次开始选时值的下标
if(m == k)//选了k个数
{
if(ifprime(sum)) res ++;
return ;//如果是素数结果+1,然后返回重新选 ,这里的return时返回到下面的 dfs(m + 1, sum + a[i], st + 1);
}
for(int i = st; i < n; i ++) dfs(m + 1, sum + a[i], i + 1);//i控制下标以免选到重复的数字
return ;
}
int main()
{
cin >> n >> k;//n个数中选择k个
for(int i = 0; i < n; i ++) cin >> a[i];//输入n个数据
dfs(0, 0, 0);//已选的k与和初值都为0
cout << res << endl;
return 0;
}
如果不看大佬题解的话我是万万做不出来的,(我最讨厌递归了)y1s1大佬真的好厉害啊,注解也完全是我看得懂的程度
原答案在这https://www.luogu.com.cn/blog/crab-in-northeast/solution-p1036