洛谷 P1036 选数

看了题解,竟然有大佬枚举出来了,最多用了10个for,tql%%%

刚开始就想着用深搜了,第一发wa了,重复计算了,后来改过来了

题目

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

3+7+12=22  3+7+12=22

3+7+19=29  3+7+19=29

7+12+19=38  7+12+19=38

3+12+19=34  3+12+19=34。

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

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

输入输出格式

输入格式:

键盘输入,格式为:

n , k ≤ ≤ 2n )

x, x, … , xn≤ xi ≤ 5000000)

输出格式:

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

输入输出样例

输入样例#1: 
4 3
3 7 12 19

 

输出样例#1: 
1

题解

 1 // luogu-judger-enable-o2
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cmath>
 5 
 6 using namespace std;
 7 void dfs(int num);   //深搜
 8 bool check(int num); //判断这个数在前面出现过没有
 9 bool judge(int num); //判断合法的和是不是素数
10 bool fun(int num);   //避免重复计算,保证后面的数下标比前面的数下标大
11 int n, k, ans, a[30], b[30];
12 
13 int main()
14 {
15     cin >> n >> k;
16     for(int i = 0; i < n; i ++ )  scanf("%d",&a[i]);
17     
18     dfs(0);
19     printf("%d",ans);
20     return 0;
21 }
22 
23 void dfs(int num)
24 {
25     if(num >= k)
26     {
27         if(fun(num))
28         {
29             int temp = 0;
30             for(int i = 0; i < k; i ++ )
31             temp += a[b[i]];
32             //printf("%d\n",temp);
33             if(judge(temp))  ans ++ ;
34             return;     
35         } else  return;
36     }
37     for(int i = 0; i < n; i ++ )
38     {
39         b[num] = i;
40         if(check(num))
41             dfs(num + 1);
42     }
43 }
44 
45 bool check(int num)
46 {
47     for(int i = 0; i < num; i ++ )
48         if(b[i] == b[num])  return 0;
49     return 1;
50 }
51 
52 bool judge(int num)
53 {
54     for(int i = 2; i <= sqrt(num); i ++ )
55         if(num % i == 0)  return 0;
56     return 1;
57 }
58 
59 bool fun(int num)
60 {
61     for(int i = 0; i < num - 1; i ++ )
62       if(b[i] > b[i + 1])  return 0;
63     return 1;
64 }

 

posted @ 2019-06-04 22:59  chuyds  阅读(378)  评论(0编辑  收藏  举报