import sys
input = sys.stdin.readline
def BOJ7579():
N, M = map(int, input().split())
bytes = list(map(int, input().split()))
costs = list(map(int, input().split()))
total = sum(costs)
result = total
dp = [[0 for _ in range(total+1)] for _ in range(N + 1)]
for i in range(1, N+1) :
byte, cost = bytes[i-1], costs[i-1]
for j in range(total + 1) :
if j < cost :
dp[i][j] = dp[i-1][j] # 코스트가 현재 앱의 끄는 비용보다 작으면 앱을 끄지 못한다
else :
dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost] + byte)
# 끄지않고 그대로 두어서 확보할 수 있는 메모리가 더 큰경우와 꺼서 메모리를 확보하는 경우의 비교
if dp[i][j] >= M :
result = min(result, j)
print(dp)
if M == 0 :
print(0)
else :
print(result)
BOJ7579()
접근 방법 :
1. dp는 비용에 따라 앱을 껐을때 확보할 수 있는 메모리를 나타내는 배열이다.
2. dp를 갱신시켜줄때의 로직에 집중하자.
장애물 이였던 것 :
1. dp는 매번 새로워서 dp 로직을 생각해는데 애를 많이 먹었다
2. 힙색과 같은 방식으로 접근하면 될것 같다.
https://www.acmicpc.net/problem/7579
7579번: 앱
입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
피사노 주기 [백준 9471] - python (0) | 2022.02.13 |
---|---|
피보나치 수 3 [백준 2749] - python (0) | 2022.02.12 |
곱셈 [백준 1629] - python (0) | 2022.02.10 |
행렬 제곱 [백준 10830] - python (0) | 2022.02.09 |
이항계수 [백준 11401] - python (0) | 2022.02.08 |