문제
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
알고리즘
- 물건의 수에 따라 가방에 물건을 얼마나 담을 수 있는지 확인한다.
- 반복문을 통해 각 물건의 무게와 가치를 확인하고 가방에 담을 수 있는 물건의 최대 가치를 각각 구한다.
- 현재 비교하고 있는 가방의 최대 무게가 현재 물건의 무게보다 작다면 이전에 비교했던 가방의 무게에 담겨져 있는 가치가 최대 가치가 된다.
- 현재 비교하고 있는 가방의 최대 무게가 비교하고 있는 물건의 무게보다 크거나 같다면 이전에 비교했던 가방의 현재 무게의 가치와 이전에 비교했던 가방의 무게에서 현재 물건의 무게만큼 뺀 무게의 가치 + 현재 물건의 가치 중 제일 큰 가치가 현재 가방에 담을 수 있는 최대 가치가 된다.
코드
import sys
n, k = map(int, sys.stdin.readline().split())
bag = [[0, 0]]
for _ in range(n):
bag.append(list(map(int, sys.stdin.readline().split())))
dp = [[0]*(k + 1) for _ in range(n + 1)]
# 물건의 수에 따라 가방에 물건을 얼마나 담을 수 있는지 확인
# 반복문을 통해 각 물건의 무게와 가치를 확인
for i in range(1, n + 1):
w = bag[i][0]
v = bag[i][1]
# 가방의 무게
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], dp[i - 1][j - w] + v)
print(dp[n][k])
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 9095번(파이썬): 1, 2, 3 더하기 (0) | 2021.11.17 |
---|---|
[baekjoon] 백준 1463번(파이썬): 1로 만들기 (0) | 2021.11.16 |
[baekjoon] 백준 1261번(파이썬): 알고스팟 (0) | 2021.11.14 |
[baekjoon] 백준 3055번(파이썬): 탈출 (0) | 2021.11.13 |
[baekjoon] 백준 1520번(파이썬): 내리막 길 (0) | 2021.11.12 |