article thumbnail image
Published 2021. 5. 3. 22:19

풀이 방법

dp[i][j] : i번째 추까지 사용했을 때 무게 j를 만들 수 있는지 여부

i번째 상태는 i - 1번째 상태에 i번째 무게만큼 더할 것인지 뺄 것인지 아무것도 안 할 것인지로 정의할 수 있다.

 

코드

무게가 음수인 경우를 커버하기 위해 40000을 기본값으로 했다.

#include <cstdio>

int weight[32];
bool dp[32][80004];
int main() {
    int N; scanf("%d", &N);
    for (int i = 1; i <= N; i++)
        scanf("%d", weight + i);

    dp[0][40000] = true;

    for (int i = 1; i <= N; i++) {
        for (int j = 0; j <= 80000; j++) {
            if (!dp[i - 1][j]) continue;
            dp[i][j] = true;
            if (j + weight[i] <= 80000) dp[i][j + weight[i]] = true;
            if (j - weight[i] >= 0) dp[i][j - weight[i]] = true;
        }
    }
    int T; scanf("%d", &T);
    while (T--) {
        int input; scanf("%d", &input);
        if (dp[N][input + 40000]) printf("Y ");
        else printf("N ");
    }
}

 

문제 링크: www.acmicpc.net/problem/2629

 

'Algorithm > BOJ' 카테고리의 다른 글

백준[2887] 행성터널  (0) 2021.06.22
백준[1774] 우주신과의 교감  (0) 2021.06.22
백준[4386] 별자리 만들기  (0) 2021.06.22
백준[9372] 상근이의 여행  (0) 2021.06.21
백준[20040] 사이클게임  (0) 2021.06.21
복사했습니다!