0/1 Kanpsack Problem -> DP로 푼다.
- [아이템, 가방허용치]를 뜻하는 arr 배열을 만든다.
- 가방허용치가 아이템 무게보다 작다면, 이전 아이템의 가치(arr[i-1])를 가져온다.
- 크거나 같다면, 이전 아이템의 가치와(arr[i-1]) 아이템과 허용치를 만들수 있는 가치(arr[i-1][j-w]) 중 큰값을 고른다.\
- 마지막 값을 출력한다.
ex) 아이템 3(w)일때 허용치5(j) 이라면
- 1, 2 일때는 이전아이템(i-1)의 j를 가져온다.
- 3, 4, 5 일때는 이전아이템(i-1)의 허용치 j-w(5-3=2)인 것과 j인 것을 비교한다.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
arr = [[0]*(K+1) for _ in range(N+1)]
items = [[]]
for _ in range(N):
items.append(list(map(int, input().split())))
for i in range(1, N+1):
w, v = items[i]
for j in range(1, K+1):
if j-w < 0:
arr[i][j] = arr[i-1][j]
else:
arr[i][j] = max(arr[i-1][j], arr[i-1][j-w]+v)
print(arr[N][K])
'개발 > 알고리즘' 카테고리의 다른 글
[백준 1197] 최소 스패닝 트리 (python) (0) | 2021.04.18 |
---|---|
[백준 13549] 숨바꼭질 3 (python) (0) | 2021.04.13 |
[백준 2206] 벽 부수고 이동하기 (python) (0) | 2021.04.07 |
[백준 9251] LCS (python) (0) | 2021.04.07 |
[백준 1753] 최단경로 (python) (0) | 2021.03.30 |
최근댓글