image.png

image.png

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

int main() {
    int num, kilo;
    cin >> num >> kilo; // 물건의 개수(num)와 배낭의 최대 무게(kilo)를 입력받음

    vector<int> weights(num + 1, 0); // 각 물건의 무게를 저장하는 배열, 인덱스 1부터 사용
    vector<int> values(num + 1, 0); // 각 물건의 가치를 저장하는 배열, 인덱스 1부터 사용

    // DP 테이블: dp[i][w]는 i번째 물건까지 고려했을 때, 배낭의 용량이 w일 때의 최대 가치를 저장
    vector<vector<int>> dp(num + 1, vector<int>(kilo + 1, 0));

    // 물건의 무게와 가치를 입력받음
    for (int i = 1; i <= num; i++)
    {
        cin >> weights[i] >> values[i]; // i번째 물건의 무게와 가치를 입력받음
    }

    // DP 테이블을 채움
    for (int i = 1; i <= num; i++) // i번째 물건까지 고려
    {
        for (int w = 0; w <= kilo; w++) // 배낭의 현재 무게 한도 w
        {
            if (weights[i] <= w) // 현재 물건을 배낭에 넣을 수 있는 경우
            {
                // i번째 물건을 넣지 않는 경우와 넣는 경우 중 최대 가치를 선택
                dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i]] + values[i]);
            }
            else
            {
                // i번째 물건을 넣을 수 없는 경우 이전 단계 값 유지
                dp[i][w] = dp[i - 1][w];
            }
        }
    }

    // 가능한 최대 가치를 출력
    cout << dp[num][kilo] << endl;
    return 0;
}

dp(다이나믹 프로그래밍)

배낭