洛谷 P1036 选数 题解

题目描述
已知 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)。
输入格式:
键盘输入,格式为:
n , k (1<=n<=20,k<n) x1,x2,…,xn (1<=xi<=5000000) 输出格式: 屏幕输出,格式为: 一个整数(满足条件的种数)。 输入样例:

1
2
4 3
3 7 12 19

输出样例#:

1
1

头一回真正自己用动态规划貌似是搜索写程序,竟然一次AC,迷之感动……/感动的哭

题解:
1

20180718更新:重做题遇到一些小麻烦,再把代码贴上来警示一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>
#include<memory.h>
using namespace std;
int n,k;
int arr[30];
bool isprime(int num){
    for(int i=2;i<=sqrt((double)num);i++){
        if(num%i==0)return false;
    }
    return true;
}
int dfs(int pos,int cnt,int sum){
    if(cnt==0){
        if(isprime(sum))return 1;
        else return 0;
    }
    int cnter=0;
    for(int i=pos+1;i<n;i++){
        cnter+=dfs(i,cnt-1,sum+arr[i]);
    }
    return cnter;
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)cin>>arr[i];
    cout<<dfs(-1,k,0);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注