题目描述
已知 n 个整数 ,以及 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(1≤n≤20,k<n)。
第二行 n 个整数(1<=x<=5×10000000)。
输出格式
输出一个整数,表示种类数。
输入输出样例
输入
4 3 3 7 12 19
输出
1
第一次写题解,瑟瑟发抖
举个例子:从1,2,3,4,四个数中选三个数,用一种常规方法~~(小学生都会(wo hen cai))~~
顺序如下:
1+2+3=6
1+2+4=7
1+3+4=8
2+3+4=9
就这样,看16分代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[20];//存数
int b[20];//每层选数的位置
int n, k, m = 0;
int prime(int e) { //判断素数
for (int q = 2; q * q <= e; q++) {
if (e % q == 0) { //判断为假时
return 0;
}
}
return 1;
}
void dfs(int w) { //层数
if (w > k) {
int sum = 0;
for (int q = 1; q <= k; q++) {
sum = sum + a[b[q]]; //可以写成sum+=a[b[q]]
}
if (prime(sum)) { //判断为真时
m++;
}
}
for (int q = b[w - 1] + 1; q <= n; q++) { //b[w-1]为上一次所选的数
b[w] = q; //当前w层选择了x个数中第q个位置的数
dfs(w + 1);
}
}
int main() {
cin >> n >> k;
for (int q = 1; q <= n; q++) {
cin >> a[q];
}
dfs(1);
cout << m;
return 0;
}
输入用3 2
1 1 1
输出是4(其实只有3种)
下面是AC代码:
.#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[20];/存数
int b[20];//每层选数的位置
int n.k, m = 0;
int prime(int e) { //判断素数
for (int q = 2; q * q <= e; q++) {
if (e % q == 0) { //判断为假时
return 0;
}
}
return 1;
}
void dfs(int w) { //层数
if (w > k) {
int sum = 0;
for (int q = 1; q <= k; q++) {
sum = sum + a[b[q]]; //可以写成sum+=a[b[q]]
}
if (prime(sum)) { //判断为真时
m++;
}
return ;
}
for (int q = b[w - 1] + 1; q <= n; q++) { //b[w-1]为上一次所选的数
b[w] = q; //当前w层选择了x个数中第q个位置的数
dfs(w + 1);
}
}
int main() {
cin >> n >> k;
for (int q = 1; q <= n; q++) {
cin >> a[q];
}
dfs(1);
cout << m;
return 0;
}