[BOJ 12865] 평범한 배낭
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