문제 풀이
최대 무게가 주어진 뒤, 개별 무게들을 통해 최대 가치를 구하는 문제이므로, DP로 풀 수 있다.
(DP 설명 : gaza-anywhere-coding.tistory.com/117)
코드 작성시 특징
뒤에서부터 반복문이 진행되도록 알고리즘을 작성하면, 훨씬 효율적으로 코드를 작성할 수 있다.
앞에서 부터 수행 | 뒤에서 부터 수행 | |
dp 배열 특징 | 이차원 배열 | 일차원 배열 |
반복문 수행 | 완전 이중 반복 | "최대무게 - 무게단위" 만큼씩 수행 |
뒤에서 반복문 수행한 코드 (Better)
import sys
# sys.stdin = open("C:/Users/JIn/PycharmProjects/coding_Test/input.txt", "rt")
# input data
n, max_weight = map(int, input().split())
data = [tuple(map(int, input().split())) for _ in range(n)] # weight, value
# dynamic programming
answer = -1
dp = [0] * (max_weight + 1)
for i in range(n):
unit_weight = data[i][0]
unit_value = data[i][1]
for weight in range(max_weight, unit_weight-1, -1):
dp[weight] = max(dp[weight], dp[weight - unit_weight] + unit_value)
print(dp[max_weight])
앞에서 반복문 수행한 코드 (Worse)
import sys
#sys.stdin = open("C:/Users/JIn/PycharmProjects/coding_Test/input.txt", "rt")
# input data
n, m = map(int, input().split())
data = [(0, 0)] + [tuple(map(int, input().split())) for _ in range(n)] # weight, value
# dynamic programming
answer = -1
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for weight in range(1, m + 1):
unit_weight = data[i][0]
unit_value = data[i][1]
if unit_weight > weight:
dp[i][weight] = dp[i - 1][weight]
else: # unit_weight <= weight
dp[i][weight] = max(dp[i - 1][weight], dp[i - 1][weight - unit_weight] + unit_value)
print(dp[n][m])
'코딩 테스트' 카테고리의 다른 글
[구현][백준, 1157] 단어 공부 (0) | 2021.05.11 |
---|---|
[스택][프로그래머스] 괄호 회전하기 (0) | 2021.04.26 |
[DP][프로그래머스] 거스름돈 (0) | 2021.04.22 |
[그리디][백준, 1027] 토너먼트 (0) | 2021.04.20 |
[DFS][백준, 4963] 섬의 개수 (0) | 2021.04.20 |