Doby's Lab

백준 12865번: 평범한 배낭 (C++) 본문

PS/BOJ

백준 12865번: 평범한 배낭 (C++)

도비(Doby) 2022. 6. 29. 23:23

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


Solved By: Knapsack DP

 

처음으로 시도해본 Knapsack DP문제입니다. 이론을 공부하면서 코드를 써봤는데 아직 완전히 이해되지는 않았습니다.

각 아이템 당 무게와 가치는 pair형 배열을 선언하여 저장해주었습니다.

#include <iostream>
using namespace std;

int n, k;
int cache[101][100001]; // 물품의 최대 개수 = 100개, 준서가 버틸 수 있는 최대 무게 100000
pair<int, int> item[101];

int main(){
    cin >> n >> k;
    for(int i = 1; i <= n; i++){
        // first == 무게, second = 가치
        cin >> item[i].first >> item[i].second;
    }
    
    for(int i = 1; i <= n; i++){ // 각 보석에 대하여
        for(int j = 1; j <= k; j++){ // 최대 제한 무게가 j이 일 때
            if(item[i].first <= j){
                // 현재 아이템 무게에 대하여 넣을 수 있을 때
                
                // 1) 넣지 않는다.
                // 전 아이템을 넣고, 무게 배낭 한도가 j였을 때의 최대 이익 값을 가져온다.
                // => cache[i - 1][j]
                
                // 2) 넣지 않은 것보다 현재 물건을 넣은 것이 더 좋은 경우
                // => item[i].second + cache[i - 1][j - item[i].first]
                // == 현재 아이템의 가치 + 이전까지 물건을 넣었고, 무게 한도가 j - weight(i)일 때
                cache[i][j] = max(cache[i - 1][j], item[i].second + cache[i - 1][j - item[i].first]);
            }
            else{
                cache[i][j] = cache[i - 1][j];
            }
        }
    }
    
    cout << cache[n][k];
    return 0;
}

 

728x90