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])
'알고리즘💻 > DP' 카테고리의 다른 글
BOJ 13301번: 타일 장식물 (0) | 2021.05.05 |
---|---|
BOJ 17626번: Four Squares (0) | 2021.03.23 |
BOJ 14494번: 다이나믹이 뭐예요? (0) | 2021.01.24 |
BOJ 20500번: Ezreal 여눈부터 가네 ㅈㅈ (0) | 2021.01.24 |
BOJ 1463번: 1로 만들기 (0) | 2021.01.24 |