P1036 选数

题目描述

已知 n 个整数 x1,x2,…,xn,以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为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,k
x1,x2,…,xn (1 ≤ xi ≤ 5000000)
(1 ≤ n ≤ 20,k<n, 1≤n≤20, k<n)

输出格式:

屏幕输出,格式为: 1个整数(满足条件的种数)。

输入输出样例

输入样例#1:

4 3
3 7 12 19

输出样例#1:

1


#include <iostream>
using namespace  std;
int n,k,m = 0;
int data[20];

bool ifPrime(int m) {
	for (int i = 2; i < m; i++) {
		if (m%i == 0) {
			return false;
		}
	}
	return true;
}
void f(int sum,int depth, int count) {
	if (depth > n) return;
	if (count == k) {
		if (ifPrime(sum)) ::m++;
		return;
	}
	for (int i = depth; i < n; i++) {
		sum = sum + ::data[i];
		f(sum, i+1,count+1);
		sum = sum - ::data[i];
	}
}
int main() {
	cin >> n >> k;
	for (int i = 0; i < n; i++) cin >> ::data[i];
	f(0, 0,0);
	cout << m << endl;
	return 0;
}
posted @ 2019-02-21 15:28  老耗子  阅读(123)  评论(0编辑  收藏  举报