본문 바로가기

알고리즘/백준

2629. 양팔저울

구슬의 무게를 구하기 위해서는 두 양팔 저울무게의 차이를 구하면 된다. 쉽게 접근하면 추1번을 왼쪽에 올릴 수도, 오른쪽에 올릴 수도, 올리지 않을 수도 있다. 근데 추가 30개 까지 가능하다. 즉 3의 30승 = 205,891,132,094,649 에 해당하는 경우의 수를 가질 수 있다. 이러면 약간 불안하다. 따라서 경우의 수를 적게 만들거나 이미 계산한 것은 계산하지 않는 방식을 취해야한다.

왼쪽 오른쪽에 놓을수 있고 놓지 않을 수도 있다. -> 탐색. dfs를 생각하게 되었다.

dfs의 리턴 조건에서 추의 개수가 다 차면 리턴하면 좋을 것 같았다.

import sys;input=sys.stdin.readline
n = int(input())
weights = list(map(int,input().split()))
k = int(input())
marbles = list(map(int,input().split()))
dp = [[0 for _ in range(15001)] for _ in range(n+1)]
possible = []

def dfs(weights, n, now, left, right):
  new = abs(left - right)

  if new not in possible: 
    possible.append(new)

  if now == n : return 0

  if dp[now][new] == 0:
    dfs(weights, n, now + 1, left + weights[now], right)
    dfs(weights, n, now + 1, left, right + weights[now])
    dfs(weights, n, now+1, left, right)
    dp[now][new] = 1
dfs(weights, n, 0, 0, 0)
for i in range(0, k):
  if marbles[i] in possible:
    print("Y" , end = " ")
  else:
    print("N", end = " ")

 

'알고리즘 > 백준' 카테고리의 다른 글

17299. 오등큰수  (0) 2022.04.11
15681. 트리와 쿼리  (0) 2022.04.07
1189. 컴백홈  (0) 2022.03.29
2468. 안전 영역  (0) 2022.03.25
1826. 연료 채우기  (0) 2022.03.24