728x90
반응형

백트래킹 & 소수 판정(에라토스테네스의 체) 문제이다. 꽤 좋은 퀄리티의 문제인 것 같다.

def dfs(depth):
    if depth == M:
        s.add(sum(li))
    for i in range(N):
        if check[i]:
            continue
        li.append(nums[i])
        check[i] = 1
        dfs(depth+1)
        li.pop()
        for j in range(i+1, N):
            check[j] = 0

def prime(n):
    li = [1]*(n+1)
    for i in range(2, int(n**0.5)+1):
        if li[i]:
            for j in range(i+i, n+1, i):
                li[j] = 0
    p = [i for i in range(2, n+1) if li[i]]
    return p

N, M = map(int, input().split())
nums = list(map(int, input().split()))
s = set()
li = []
check = [0]*N
dfs(0)
p = prime(1000*M)
ok = 0
if s:
    for n in sorted(s):
        if n in p:
            ok = 1
            print(n, end=' ')
if ok == 0:
    print(-1)
728x90
반응형

+ Recent posts