와이유스토리

[DP] 백준 12865 평범한 배낭 C++ 본문

코딩테스트/동적계획법

[DP] 백준 12865 평범한 배낭 C++

유(YOO) 2022. 1. 27. 12:22

 

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

 

#include<iostream>
#include<vector>
using namespace std;

int n, k, a, b, ans;
int dp[101][100001];
vector<int> W;
vector<int> V;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> k;
    
    for (int i = 0; i < n; i++) {
        cin >> a >> b;
        W.push_back(a);
        V.push_back(b);
    }
    
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= k; j++) {
            if ((i == 0)||(j == 0)) {
                dp[i][j] = 0;
                continue;
            }

            if (j < W[i-1]) { // i번 물건 미포함
                dp[i][j] = dp[i - 1][j];
            }
            else { // i번 물건 포함
                dp[i][j] = max(dp[i-1][j], V[i-1] + dp[i - 1][j - W[i-1]]);
            }
        }
    }
    cout << dp[n][k];
}
Comments