PS/동적 계획 알고리즘[DP]

백준 12865 평범한 배낭(c++)

SeungbeomKim 2023. 1. 27. 17:32

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

주어진 입력은 배낭의 무게(w)와 가치(v)입니다. 배낭의 수용량을 넘지 않으면서 가치의 최댓값을 구하는 문제입니다. 

점화식은 다음과 같이 세울 수 있습니다.

물건을 담지 않은 경우 D[i][j] = D[i-1][j]

물건을 담은 경우 D[i][j] = D[i-1][j-w[i]] + v[i]

물건을 담은 경우 에는 수용량과 가치 갱신해줘야 합니다. 

3행 7열을 기준으로 보면, D[i-1][j-w[i]](8) + v[i](6) = 14 > D[i-1][j] = 13 이므로 14로 갱신되었음을 확인할 수 있습니다.

 

<코드>

#include <iostream>

using namespace std;
// D[i][j] = i번째 물건 고려, 배낭에 넣은 물건 무게의 합이 j일 때, 가치의 최댓값
// 점화식 물건을 넣은 경우, D[i-1][j-w[i]] + v[i];
// j-w[i]>=0 -> d[i][j] = max(d[i][j], d[i-1][j-w[i]]+v[i]);
// 물건을 넣지 않은 경우, 변화 x : D[i-1][j]

int main()
{
    int d[101][100001];
    int v[101];
    int w[101];
    int n, k;
    cin>>n>>k;
    for(int i=1;i<=n;i++) {
        cin>>w[i]>>v[i];
    }
    d[0][0] = 0;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=k;j++) {
            d[i][j] = d[i-1][j];
            if(j-w[i]>=0) {
                d[i][j] = max(d[i][j],d[i-1][j-w[i]]+v[i]);
            }
        }
    }
    cout<<d[n][k]<<'\n';
}

 

'PS > 동적 계획 알고리즘[DP]' 카테고리의 다른 글

백준 1495 기타리스트(c++)  (0) 2023.01.27
백준 11066 파일 합치기(c++)  (0) 2023.01.27
백준 10942 팰린드롬?(c++)  (0) 2023.01.27
백준 15486 퇴사 2(c++)  (0) 2023.01.26
백준 11048 이동하기(c++)  (0) 2023.01.26