티스토리 뷰

참고: 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

 


다이나믹 프로그래밍을 공부했다면 한 번쯤 풀어 봤을 배낭 문제입니다.

 

사실 배낭 문제는 두 가지 유형으로 나눌 수 있습니다. 하나는 배낭에 들어갈 물건을 나눌 수 있는 '분할 가능 배낭 문제' 이고, 다른 하나는 물건을 나눌 수 없는 '0-1 배낭 문제' 입니다. 위 문제는 0-1 배낭 문제에 해당하며, 분할 가능 배낭 문제와 관련한 문제는 나중에 다루도록 하겠습니다.

 

이 문제를 풀기 위해서는 DP를 사용한다고 말씀드렸고, DP 풀이 방식에는 타뷸레이션과 메모이제이션이 있는데, 이 문제는 타뷸레이션이 이해가 편하기 때문에 타뷸레이션으로 풀이하겠습니다.

 

테이블을 그리기 위해서는 기준이 있어야 합니다. 여기서 그 기준은 물품의 개수와 배낭에 들어있는 짐의 무게가 될 것 입니다. 

 

다시 말하자면, 배낭에 짐이 1개가 있고, 그 무게가 1일 때 최대 가치, 2 일때 최대 가치, ... K 일때의 최대 가치를 표에 나타내는 것 입니다.  세로 축이 물품의 수, 가로 축이 배낭의 무게를 나타냅니다.

  0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 0 0 6 8 12 13 13
2 0 0 0 6 8 12 13 14
3 0 0 0 6 8 12 13 14
4 0 0 0 6 8 12 13 14

 

- 물품의 수가 0인 경우, 모든 가치가 0 입니다. 물품을 배낭에 넣지 않았기 때문입니다.

 

- 물품의 수가 1인 경우, 배낭의 무게가 3인 경우 가치가 6, 무게가 4인경우 가치가 8, ... , 7인 경우 가치가 13 입니다. 여기서 14가 아닌 이유는 물품이 단 한개만 들어가 있는 경우이기 때문입니다.

 

- 물품의 수가 2인 경우, 배낭의 무게가 3인 경우 가치가 6, 무게가 4인경우 가치가 8, ... , 7인 경우 가치가 14 입니다.

여기서는 13이 아닌 14가 되었습니다. 이제 물품을 2개 넣을 수 있기 때문입니다.

 

마지막 5행 8열에는 우리가 배낭에 넣을 수 있는 물품의 최대 가치 합이 저장 되었습니다.

 

 

Python

Java

728x90

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

[백준] 1915 가장 큰 정사각형  (0) 2021.06.17
[백준] 9251 LCS  (0) 2021.06.16
[백준] 11000 강의실 배정  (0) 2021.06.12
[백준] 2250 트리의 높이와 너비  (0) 2021.06.12
[백준] 2263 트리 순회  (0) 2021.06.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함