P1036 [NOIP2002 普及组] 选数

[NOIP2002 普及组] 选数

题目链接

题目描述

已知 n 个整数 x1,x2,,xn,以及 1 个整数 kk<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4k=34 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29

输入格式

第一行两个空格隔开的整数 n,k1n20k<n)。

第二行 n 个整数,分别为 x1,x2,,xn1xi5×106)。

输出格式

输出一个整数,表示种类数。

样例 #1

样例输入 #1

4 3
3 7 12 19

样例输出 #1

1

提示

【题目来源】

NOIP 2002 普及组第二题

#include<vector>
#include<iostream>
using namespace std;
int n, k;
int a[25];
vector<int> path;
int cnt;
int isprime(int n) {
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
for (int i = 3; i <= n / i; i+=2) {
if (n % i == 0) return 0;
}
return 1;
}
void dfs(int n, int k, int sum, int a[],vector<int> path,int startindex) {
if (path.size() == k) {
if (isprime(sum)) cnt++;
return;
}
//记得传入1
for (int i = startindex; i <= n-(k-path.size())+1; i++) {
sum += a[i];
path.push_back(a[i]);
dfs(n, k, sum, a, path, i + 1);
sum -= a[i];
path.pop_back();
}
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
dfs(n, k, 0, a, path, 1);
cout << cnt;
return 0;
}
posted @   名称无法显示  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示