본문 바로가기
알고리즘/백준

[백준/C,C++] 12865번: 평범한 배낭

by 이민훈 2021. 3. 8.

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

예제 입력으로 바로 설명드리겠습니다. 물건의 수는 4이고, 버틸 수 있는 무게는 7입니다. 각 물건의 무게와 가치는 6/13, 4/8, 3/6, 5/12 입니다.

  배낭 무게 1 배낭 무게 2 배낭 무게 3 배낭 무게 4 배낭 무게 5 배낭 무게 6 배낭 무게 7
물건1 (6/13) 0 0 0 0 0 13 13
물건2 (4/8) 0 0 0 8 8 13 13
물건3 (3/6) 0 0 6 8 8 13 14
물건4 (5/12) 0 0 6 8 12 13 14

물건3을 넣을지 말지 고민중일때 배낭 무게가 7이면 고려 해봐야 할 물건들의 조합은 다음과 같습니다. 무게 7의 배낭에 포함된 물건들, 무게 1의 배낭에 포함된 물건들 + 무게 6의 배낭에 포함된 물건들, 2 + 5, 3 + 4 즉, 이 합 중에 물건3을 넣는 경우의 가치가 최댓값일 때, 물건3을 넣게 되는 것인데 무게 4의 배낭에 포함된 물건들의 가치는 8로, 물건3을 넣었을땐 가치가 14가 됩니다. 무게 7의 배낭에 넣을 수 있는 물건들의 최대가치는 13이었는데, 물건3을 넣고 더 높은 가치를 추구할 수 있게 됩니다. 이 로직을 그대로 코드로 옮긴 후 물건을 최대로 넣었을때, 배낭의 무게가 최대 일때 값을 출력해주면 됩니다.

#include<iostream>

using namespace std;

#define MAX 101
#define MAX_WEIGHT 100001

int DP[MAX][MAX_WEIGHT];

int main(void)
{
    int N, K; cin >> N >> K;

    for (int i = 1; i <= N; i++) {
        int W, V; cin >> W >> V;
        for (int j = 0; j <= K; j++) {
            if (j < W) {
                DP[i][j] = DP[i - 1][j];
            }
            else {
                DP[i][j] = max(DP[i - 1][j], DP[i - 1][j - W] + V);
            }
        }
    }

    cout << DP[N][K];

    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C,C++] 11399번: ATM  (0) 2021.03.13
[백준/C,C++] 11047번: 동전 0  (0) 2021.03.12
[백준/C,C++] 1912번: 연속합  (0) 2021.03.08
[백준/C,C++] 9251번: LCS  (0) 2021.03.08
[백준/C,C++] 2565번: 전깃줄  (0) 2021.03.08

댓글