当前位置: 代码迷 >> 综合 >> [NOIP2002]选数
  详细解决方案

[NOIP2002]选数

热度:35   发布时间:2023-12-05 18:17:03.0

Description
已知 n 个整数 x1,x2,…,xn,以及一个整数 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)。

Input
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)

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

Sample Input
4 3
3 7 12 19
Sample Output
1
DFS

#include<iostream>
using namespace std;
const int N=30;
int a[N];
int n,k,ans;//ans是答案bool is_prime(int x)//判断是否是素数
{
    for(int i=2;i<x/i;i++){
    if(x%i==0) return false;}return true;
}void dfs(int index,int u,int s)
{
    if(u==k){
    if(is_prime(s))ans++;}for(int i=index;i<n;i++)dfs(i+1,u+1,s+a[i]);     
}
int main()
{
    cin>>n>>k;for(int i=0;i<n;i++)cin>>a[i];dfs(0,0,0);cout<<ans;return 0;
}