알고리즘💻/DP

BOJ 12865번: 평범한 배낭

호프 2021. 1. 24. 23:17

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[i][k] = 최대 배낭 수용 무게가 k일때, i번째 까지의 물건을 봤을 때 가치의 최대합

i번째 물건을 넣을 수 있는 경우(k>=wi): max(dp[i-1][k-wi]+vi, dp[i-1][k]) i번째 물건을 넣을 때 vs 넣지 않을 때 가치가 더 큰 것 선택

i번째 물건을 넣을 수 없는 경우(k<wi): dp[i-1][k] 이전 값이 그대로

-> dp[n][k] 출력

import sys
n, k = map(int, sys.stdin.readline().split())
arr = []
arr.append([0,0])

for _ in range(n):
    arr.append(list(map(int, sys.stdin.readline().split())))
dp = [[0]*(k+1) for _ in range(n+1)]

#dp[i][j] = 최대 배낭 수용 무게가 j일때, i번째 까지의 물건을 봤을 때 가치의 최대합
for i in range(1,n+1):
    for j in range(1, k+1):
        #i번째 물건을 넣을 수 있는 경우
        if (j>=arr[i][0]):
            #물건을 넣는 경우, 넣지 않는 경우 중 가치합이 더 큰 것 저장
            dp[i][j] = max(dp[i-1][j-arr[i][0]]+arr[i][1], dp[i-1][j])
        #i번째 물건을 넣을 수 없는 경우
        else:
            dp[i][j] = dp[i-1][j]
            
print(dp[n][k])