문제


제한된 무게안에 물품들을 챙겨서 가장 가치있는 배낭을 만드는 문제다

물품마다 무게와 가치가 제각각 

 

문제 해결을 위한 준비물


DP에 대한 지식 -  점화식을 만들어서 계산하기 위함 (...)

더보기

자세히는 모르겠지만 배낭문제(0/1 Knapsack Problem)는 동적 프로그래밍 방법(DP)로 풀어야 한다고 한다

코드


#include <iostream>

#define MAX_ITEM 110

using namespace std;

int N, K;
int items[MAX_ITEM];
int iWeight[MAX_ITEM];
int iValue[MAX_ITEM];
int DP[MAX_ITEM][100010] = {0};

int Max(int a, int b){ return a > b ? a : b;  }

int Solution(){
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= K; j++){
            if(j >= iWeight[i]) DP[i][j] = Max(DP[i-1][j], DP[i-1][j - iWeight[i]] + iValue[i]);
            else DP[i][j] = DP[i-1][j];
        }
    }

    return DP[N][K];
}

int main()
{
    cin >> N >> K;
    for(int i = 1; i <= N; i++){
        cin >> iWeight[i] >> iValue[i];
    }

    cout << Solution();

    return 0;
}

풀이


각 물품1부터 최대 무게까지 표를 만들고 자신이 적재할 수 있는 무게부터 가치를 적으면 된다 

만일 이전 물품의 가치가 자신의 무게를 제외한 배낭 무게에 있을 경우 더한다.

(이 때 자신의 무게이전 물품의 무게를 합쳐도 현재 무게를 넘지 않는다는 의미를 가진다  )

자신이 적재할 수 없는 무게동안이전 물품의 가치를 적는다 

 

이렇게 나온 표에 가장 마지막 자리가 우리가 구하고자하는 값이 나온다 

 

 

처음 써보는 동적 프로그래밍이라 아직도 이해가 되지 않는다  천천히 이해해 볼 수 밖에 없겠다

'프로그래밍 문제집 > 백준' 카테고리의 다른 글

1152번-단어의 개수  (0) 2022.01.20
1463번-1로 만들기  (0) 2022.01.19
10773번-제로  (0) 2022.01.17
1920번-수 찾기  (0) 2022.01.17
9012번-괄호  (0) 2022.01.16

+ Recent posts