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][j] = 배낭에 넣을수 있는 물건의 최대값
# (i번째 물건까지 j사이즈 배낭에 넣을때)
#
# dp[i][j] = max(물건이 안들어갈때의 가치, 물건의 가치 + 남은 공간의 가치)
# = max(dp[i-1][j], v + dp[i-1][j-w])
#
# (w, v) j=1 2 3 4 5 6 7
# i=1 (6, 13) 13 13
# i=2 (4, 8) 8 8 13 13
# i=3 (3, 6) 6 8 8 13 14
# i=4 (5, 12) 6 8 12 13 14
def run(N, K, a):
dp = [[0]*(K+1) for _ in range(N+1)]
a = [(0, 0)] + a # dp와 a 인덱스 동일하게 맞추기
for i in range(1, N+1):
w, v = a[i]
for j in range(1, K+1):
if j < w:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], v + dp[i-1][j-w])
return dp[N][K]
N, K = map(int, input().split())
stuff = [tuple(map(int, input().split())) for _ in range(N)]
value = run(N, K, stuff)
print(value)
'BOJ 알고리즘 (패캠) > DP' 카테고리의 다른 글
2655번: 가장높은탑쌓기 LIS (DP) - Fastcampus (0) | 2020.10.11 |
---|---|
1495번: 기타리스트 (DP) - Fastcampus (0) | 2020.10.10 |
9251번: LCS 가장 긴 공통 부분수열 (DP) - Fastcampus (0) | 2020.10.10 |
11053번: LIS 가장 긴 증가하는 부분수열 (DP) - Fastcampus (0) | 2020.10.10 |
1904번: 01타일 (DP) - Fastcampus (0) | 2020.10.09 |