백준 12865 평범한 배낭

gmlwlswldbs·2021년 10월 1일
0

코딩테스트

목록 보기
44/130

dp + 이차원 리스트
i : 번째 배낭까지 탐색
j : 총 무게
놓고 탐색하며 d[i][j] 값을 업데이트한다.
무게가 같은 것이 다른 조합으로 이미 있을 수 있으니 max를 썼다.
처음에는

if w[i] + j <= k:
	d[i][w[i] + j] = max(d[i-1][j] + d[i][w[i]], d[i][w[i] + j])
else:
	d[i][j] = max(d[i-1][j], d[i][j])

이런 식으로 짜서 갱신된 값은 업데이트가 안되는 문제가 있었다.(설명이 잘 안됨)

n, k = map(int, input().split())
w = [-1] * n
v = [-1] * n
for i in range(n):
    w[i], v[i] = map(int, input().split())
    
d = [[-1] * (k + 1) for _ in range(n)]
d[0][w[0]] = v[0] // 1번

for i in range(1, n):
    d[i][w[i]] = v[i]
    for j in range(k+1):
        if d[i-1][j] == -1:
            continue
        if w[i] + j <= k:
            d[i][w[i] + j] = max(d[i-1][j] + v[i], d[i][w[i] + j])
        d[i][j] = max(d[i-1][j], d[i][j])

print(max(d[-1]))

88% 에서 런타임 에러가 나서 봤더니 1번 부분에 문제가 있었다. w[0] > k 이면 저장 안되고 에러남

n, k = map(int, input().split())
w = [-1] * n
v = [-1] * n
for i in range(n):
    w[i], v[i] = map(int, input().split())
    
d = [[-1] * (k + 1) for _ in range(n)]

for i in range(n):
    if w[i] <= k:
        d[i][w[i]] = v[i]

for i in range(1, n):
    for j in range(k+1):
        if d[i-1][j] == -1:
            continue
        if w[i] + j <= k:
            d[i][w[i] + j] = max(d[i-1][j] + v[i], d[i][w[i] + j])
        d[i][j] = max(d[i-1][j], d[i][j])
            
if max(d[-1]) == -1:
    print(0)
else:
    print(max(d[-1]))

고쳤다.

0개의 댓글