import sys
input = sys.stdin.readline
def BOJ2629() :
n = int(input())
weight = list(map(int, input().split()))
input()
need_check = list(map(int, input().split()))
dp = [[0 for _ in range(40001)] for _ in range(n)]
dp[0][weight[0]] = 1
for i in range(1, n) :
dp[i][weight[i]] = 1
for j in range(40001) :
if dp[i-1][j] == 1 :
dp[i][j] = 1
dp[i][j + weight[i]] = 1
dp[i][abs(j - weight[i])] = 1
for i in need_check :
if dp[n-1][i] :
print("Y", end = " ")
else :
print("N", end = " ")
BOJ2629()
접근방법 :
1. dp는 추의 개수와 무게로 이루어진 배열이다.
ex) dp[0][10] 은 1개로 10의 무게를 잴수 있을까에 대한 값
dp[1][10] 은 2개로 10의 무게를 잴수 있을까에 대한 값
dp[2][10] 은 3개로 10의 무게를 잴수 있을까에 대한 값
2. dp를 탐색하면서 하나 이전의 개수로 구했던 값에서 더하고 뺀 값들은 잴수 있음을 표현해주었다.
ex) 무게가 3인 추 하나를 이용해서 3을 재었다면
무게가 2인 추 하나가 추가되면 잴수 있는 무게들은
1(3-1), 2, 3, 5(3+2) 총 4개가 된다.
https://www.acmicpc.net/problem/2629
2629번: 양팔저울
첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
네트워크 연결 [백준 1922] - python (0) | 2022.03.20 |
---|---|
동전 1 [백준 2293] - python (0) | 2022.03.19 |
전깃줄 [백준 2565] - python (0) | 2022.03.17 |
가장 긴 바이토닉 부분 수열 [백준 11054] - python (0) | 2022.03.16 |
팰린드롬? [백준 10942] - python (0) | 2022.03.15 |