Date:

1) 문제 링크

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

2) 접근

Knapsack 문제가 떠올랐다. 근데 구현은 잘 생각 안 나서 애먹었다…

3) 풀이

#include <iostream>
using namespace std;
const int MAX = 100;
const int MAX_WEIGHT = 100001;

int N, K;
int dp[MAX][MAX_WEIGHT], W[MAX], V[MAX];

// n번째 물건부터 사용해서 무게 w을 채웠을 때 가치의 최댓값
int backpack(int n, int w){
    if(n == N) { return 0; } // base case: 모든 물건을 검토한 경우
    if(dp[n][w] != -1) { return dp[n][w]; }

    int result;
    if(w < W[n]) { result = backpack(n+1, w); }
    else { result = max(backpack(n+1, w), backpack(n+1, w-W[n])+V[n]); }
    dp[n][w] = result;

    return result;
}

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> N >> K;
    for(int i=0; i<N; ++i){
        cin >> W[i] >> V[i];
    }

    // fill dp array
    for(int i=0; i<MAX; ++i){
        for(int j=0; j<MAX_WEIGHT; ++j){
            dp[i][j] = -1;
        }
    }

    cout << backpack(0, K);

    return 0;
}

4) 피드백

딱히 없다.

Leave a comment