-문제: https://www.acmicpc.net/problem/12865
-정답풀이:
풀이 방법 익혀야겠다
dp의 열이 k까지 있으므로 j가 반복문을 돌면서, 가방의 크기가 점점 커지고 있고, 거기에 물건을 넣는 거라고 생각하면 될 것 같다
if j < weight[i] (가방이 현재 담을 수 있는 무게(j)가 물건의 무게보다 적은경우)
위 상황에서는 물건을 가방에 넣을 수 있는 상황이 아니므로 이전 물건의 같은 무게 값을 누적한다
if j >= weight[i] (가방이 현재 담을 수 있는 무게가 물건의 무게보다 큰 경우)
이 상황에서는 현재 물건을 담을 수 있다. 근데 가치를 최대로 해야하기 때문에
max(이전물건, 같은무게 / 이전물건+(현재 물건 넣기 전 무게)의 가치에 현재 물건의 가치)를 계산한다
n,k=map(int,input().split())
weight=[0]
value=[0]
for _ in range(n):
a,b=map(int,input().split())
weight.append(a)
value.append(b)
dp=[[0]*(k+1) for _ in range(n+1)]
for i in range(1,n+1): #i가 현재 물건
for j in range(1,k+1): #j가 현재의 무게
if j >= weight[i]:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
else:
dp[i][j]=dp[i-1][j]
print(dp[n][k])
'백준 > DP' 카테고리의 다른 글
[dp/백준] 11722번: 가장 긴 감소하는 수열 (0) | 2022.06.11 |
---|---|
[dp/백준] 11055번: 가장 큰 증가하는 부분 수열 (0) | 2022.06.11 |
[dp/백준] 2293번: 동전1 (0) | 2022.06.07 |
[dp/백준] 11057번: 오르막 수 (0) | 2022.06.07 |
[dp/백준] 9251번: LCS (0) | 2022.06.07 |