zoukankan      html  css  js  c++  java
  • 洛谷 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
    ",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 }
  • 相关阅读:
    119. Pascal's Triangle II
    118. Pascal's Triangle
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    108. Convert Sorted Array to Binary Search Tree
    88. Merge Sorted Array
    83. Remove Duplicates from Sorted List
    70. Climbing Stairs
    陌陌面试经历
  • 原文地址:https://www.cnblogs.com/chuyds/p/10976818.html
Copyright © 2011-2022 走看看