小学生蓝桥杯Python闯关 | 选数

142 阅读1分钟

学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。

附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客


【题目描述】

已知n个整数x1,x2,...,xn,以及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个整数,分别为x1,x2,...,xn(1≤xi≤5x10e6)。

【输出描述】

输出一个整数,表示种类数。

【样例输入】

4 3

3 7 12 19

【样例输出】

1

【代码详解】

from math import *
from itertools import *
def is_prime(n):
    if n == 1: return False
    m = int(sqrt(n)+1)                 #sqrt(n)可以写为n**0.5
    for i in range(2,m):
        if n % i == 0:  return False
    return True
n,k = map(int,input().split())
q = [0] #存数据
[q.append(int(i)) for i in input().split()]
res = 0
arr = [0 for i in range(k+1)] 

def dfs(x, start):
    global res
    if x > k:
        sum = 0
        for i in range(1, k+1):
            sum += arr[i]
        if(is_prime(sum)):
            res += 1
        return

    for i in range(start, n+1):
        arr[x] = q[i]
        dfs(x+1, i+1)
        arr[x] = 0


dfs(1, 1)
print(res)

【运行结果】

4 3
3 7 12 19
1