源代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
bool check(int x)//检查一个数字是否是素数
{
if (x == 2)
return 1;
for (int i = 2; i <= sqrt(x); ++i)
{
if (!(x%i))
return 0;
}
return 1;
}
int num[20];
int main()
{
int n, k, ans = 0;
cin >> n >> k;
for (int i = 0; i < n; ++i)
scanf("%d", &num[i]);
for (int i = 0; i < (1 << n); ++i)
{
if (__builtin_popcount(i)==k)//如果找到包含k个元素的集合
{
int sum = 0;//存放k个元素之和
for (int j = 0; j < n; ++j)//遍历数组n个元素寻找本次是哪k个元素
{
if ((1 << j)&i)//如果该元素在本集合中
sum += num[j];
}
if (check(sum))
++ans;
}
}
cout << ans << endl;
return 0;
}
分析思路:
1.对于一个集合,我们用二进制表示其中某个数字是否存在,存在的设为1,不存在的设为0.
2.使用内建函数__builtin_popocount(x)可以返回x在二进制状态下的1的个数。(该函数在IDE上无法正常调用,可以在oj平台用)。