상세 컨텐츠

본문 제목

[JAVA] 백준 12865번 평범한 배낭

알고리즘

by dajingjing 2022. 5. 5. 17:55

본문

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

DP를 이용해서 푸는 문제이다.

풀면서 한번 틀리고, 찾았던 반례에 대해서 적어보려고 한다.

배열 d는 인덱스값을 무게로 하고, 그 무게에서 가질 수 있는 최대값을 최대 가치 값(원하는 답)으로 둔 변수이다.

최대로 가질 수 있는 무게(K)가 7이라고 해보자.

 

무게(W)가 4이고 가치(V)가 8이라고 하면,

d[4]에서 가질수 있는 최대값은 8이고, d가 인덱스 5,6,7에서도 가질수 있는 무게의 최대값은 8이다.

 

무게가 6이고 가치가 9라고 한다면,

d[4],d[5]에서 가질 수 있는 최대값은 8, 무게 d[6],d[7]에서 가질수 있는 최대값은 9가 된다.

 

무게가 3이고 가치가 3 이라면, 

d[3]은 3, d[4], d[5]가 가질수 있는 최대값은 8,

d[6]이 가질수 있는 최대값은 9, d[7]이 가질수 있는 최대값은 d[4]와 d[3]을 합친 11이 된다.

 

위 로직을 이용하여 문제를 풀면서 18번 줄에 j=0; j<=k; j++로 설정했었는데 틀렸었다.

반례를 찾아보니 아래와 같은 반례가 있었다.

8 6
6 12
6 13
4 8
4 7
3 7
5 13
5 11

 

j값을 0부터 시작하면, 자기 값을 두 번 계산하게 되는 오류가 발생한다.

예를들어서 d[3]의 최대값이 7이 되는 순간을 보면,

d[6]의 최대값을 구하는 방법이 Math.max(d[3] + [무게가 3인 배낭의 가치], d[6])으로 하면

d[3]에 최대박 7을 넣어주고, d[6]에서 7값을 중복으로 더해주는 경우가 발생하게 된다.

 

따라서, 무게가 W인 경우 d[W이상의 값부터 최대값 K까지] 의 범위에서 가치가 최대값인 경우를 구하기 위해서는 W값부터 K값까지 올라가면서 구하는 것이 아니라 K값부터 W값까지 내려오면서 구해야 한다.

'알고리즘' 카테고리의 다른 글

[JAVA] 백준 16964번 DFS 스폐셜 저지  (0) 2022.11.09
[JAVA] 백준 1947번 선물 전달  (0) 2022.08.15
[JAVA] 백준 1201번 NMK  (0) 2022.05.02
[JAVA] 백준 1767번 N-Rook II  (0) 2022.04.16
[JAVA] 백준 1557번 제곱ㄴㄴ  (0) 2022.04.14

관련글 더보기