티스토리 뷰

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

 

import sys

N, K = map(int, sys.stdin.readline().split())
s = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
s.insert(0, [0, 0])
dp = [[0] * (K + 1) for _ in range(N+1)]

for i in range(1, N+1):
  for j in range(1, K+1): # j = 목표 무게
    if j < s[i][0]:
      dp[i][j] = dp[i-1][j]
    else:
      dp[i][j] = max(s[i][1] + dp[i-1][j-s[i][0]], dp[i-1][j])

print(dp[N][K])

 

1. 현재 물건의 무게 목표 무게보다 작은 경우 : 이전 행의 가치 그대로 가져오기

2. 아닌 경우 :  '이전 행의 가치''목표 무게에서 현재 물건을 넣었을 때, 남는 무게의 최대 가치' 중 최댓값

         - 목표 무게에서 현재 물건을 넣었을 때, 남는 무게의 최대 가치 = dp[i-1][j-s[i][0]]

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

ex) dp[3][7]은

13(이전 행의 가치)6+8(현재 물건의 가치 + 현재 물건을 넣었을 때 남는 무게의 최대 가치 : dp[2][7-3]) 중 최댓값인 14이다.

공지사항
최근에 올라온 글
«   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
글 보관함