알고리즘/백준

백준 12865 평범한 배낭 c++ [컴공과고씨]

시간빌게이츠 2022. 4. 9. 14:44
반응형

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

이 문제같은 경우 다이나믹 프로그래밍에 대표적인 문제라고 할 수 있다.

각 경우에 대해서 최선의 선택을 하면서 가면 되는데 이 말을 이해하기 위해서는 직접해보는 것이 좋다.

표를 다 채운 결과

표를 직접 그려봤다면 이게 무슨 원리인지 알 것이다. 자신이 채우고 있는 행의 최선의 선택은 

1. dp[i][j] = dp[i][j-현재 물건 무게] + 현재 물건 가치 이다.

2. dp[i][j] = dp[i-1][j] or dp[i][j-1] 둘 중 큰 값

 

1,2번중에서 큰 값을 선택해주면 최선의 선택이 된다.

 

전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int dp[102][100002= {0};
 
int mx(int a, int b){
    return a > b ? a : b;
}
bool cmp(pair<intint> p1, pair<intint> p2){
    return p1.first < p2.first;
}
int main(){
    vector<pair<intint>> wv;    
    int n, k, w, v;
    cin >> n >> k;
    wv.push_back(make_pair(00));
    for (int i = 0; i < n;i++){
        cin >> w >> v;
        wv.push_back(make_pair(w, v));
    }
    sort(wv.begin(), wv.end(), cmp); //무게 기준 정렬
 
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= k;j++){
            if(j-wv[i].first >=0){ 
            // j-물건 무게가 음수이면 물건을 넣지 못함.
                dp[i][j] = dp[i - 1][j - wv[i].first] + wv[i].second;
            }
            if(mx(dp[i-1][j], dp[i][j-1]) > dp[i][j]){
                dp[i][j] = mx(dp[i - 1][j], dp[i][j - 1]);
                //바로 직전 값과 위의 행 값을 비교              
            }
        }
    }
    cout << dp[n][k];
    return 0;
}
cs
체감난이도 걸린시간 참고 사용 알고리즘
26min x dynamic programming
다이나믹 프로그래밍

 

반응형