sm 기술 블로그

140. 12865(평범한 배낭) 본문

문제/백준_파이썬

140. 12865(평범한 배낭)

sm_hope 2022. 7. 11. 20:22
import sys
input = sys.stdin.readline

N,K = map(int, input().split())
# K => 무게

DP = [[0]*(K+1) for _ in range(N+1)]


for i in range(1,N+1):
    weight, value = map(int, input().split())
    for j in range(1,K+1):       
        if j < weight:
            DP[i][j] = DP[i-1][j]
        else:
            DP[i][j] = max(value + DP[i-1][j-weight], DP[i-1][j])

print(DP[N][K])

문제요약

군대가기전 여행가는 준서의 배낭을 최대한 가치있게 준비할 수 있도록 하자. 

설명

첫줄에 K는 무게이다.

두번째 줄 부터 첫번째 인덱스 값이 무게이다.

 

무게 0~K까지 증가시키면서 두번째 줄부터 들어오는 물건의 무게와 가치를 비교한다.

DP i 인덱스의 0~K 무게(j) 는 각 무게에서 가장 높은 가치를 지닌 것이라고 생각하면 된다.

 

전의 무게와 , 현재 새로 갱신하는 무게를 비교해 보았을 때 더 큰 무게를 저장하면된다.

 

다음 과 같이 입력이 4 8일때 최대 4kg를 지닐 수 있다면 8의 가치가 최대이다.

하지만 최대 지닐 수 있는 무게가 6kg 일 때 4kg을 지니고 가는 것 보다는 6kg을 지니고 가는게 더 가치가 높다.

 

따라서 

DP[i][j] = max(value + DP[i-1][j-weight], DP[i-1][j])

다음과 같이 새로 갱신하는 무게와 전의 무게중 더 큰 것을 비교해서 저장하면 된다.

현재 j무게에서 weigth을 빼주는 이유는 , value를 더하게 된다면 남은 j-weight만큼 무게가 남을 것이고, 그 인덱스에 해당하는 무게를 더해주어 무게를 가지고 계산할 수 있는 가장 큰 값을 만들 수 있다.

위 공식으로 DP[전 인덱스][남은 무게의 값]의 가치와 현재 가치를 더해 최대 가치를 만들 수 있다.

'문제 > 백준_파이썬' 카테고리의 다른 글

142. 2559(수열)  (0) 2022.07.12
141. 11659(구간 합 구하기4) - 파이썬  (0) 2022.07.11
139. 9251(LCS)  (0) 2022.07.10
138. 2565(전깃줄)  (0) 2022.07.10
137. 11054(가장 긴 바이토닉 부분 수열)  (0) 2022.07.10
Comments