알고리즘/문제 풀이

12865번: 평범한 배낭

Themion 2022. 1. 10. 13:04

https://www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

각 물건의 무게와 가치를 입력받은 뒤, 현재 물건의 무게 W와 버틸 수 있는 무게 K에 대해 W <= w <= K인 모든 무게 w에 대해 기존 w에서의 최대 가치와 기존 (w - W)에서의 최대 가치 + 현재 물건의 가치 V를 비교해 최댓값을 갱신한다. 이 때, w는 K부터 1씩 줄여가며 비교해야 하는데, 그 이유는 w를 증가하는 방향으로 계산했을 때 현재 물건을 두 번 이상 포함시킬 가능성이 있기 때문이다.

#include <cstdio>

#define MAX_K 100000

int max(int a, int b) { return a > b ? a : b; }

int main() {
    // N: 물건의 개수, K: 버틸 수 있는 무게, W, V: 각 물건의 무게와 가치
    // val[w]: 가방에 무게가 w만큼 차 있을 때 가질 수 있는 가장 큰 가치
    int N, K, W, V, val[MAX_K + 1] = { 0, };
    
    // 각 물건에 대해
    for (scanf("%d %d", &N, &K); N--; ) {
        // 물건의 무게와 가치를 입력받은 뒤
        scanf("%d %d", &W, &V);
        // 현재 물건을 사용했을 때 같은 무게를 사용해 가치의 최댓값을 갱신 가능하다면 갱신
        for (int w = K; w >= W; w--)
            val[w] = max(val[w], val[w - W] + V);
    }

    printf("%d\n", val[K]);

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

13171번: A  (0) 2022.01.10
13015번: 별 찍기 - 23  (0) 2022.01.10
12852번: 1로 만들기 2  (0) 2022.01.10
12851번: 숨바꼭질 2  (0) 2022.01.10
12100번: 2048 (Easy)  (0) 2022.01.08