알고리즘/백준 문제풀이
[Python/BOJ] 백준 1106 호텔_DP
개발자 덕구🐾
2022. 9. 19. 13:28
728x90
문제에서 적어도 c명을 늘리는 것이므로 더 많이 늘리는 것도 생각을 해주어야 하기 때문에 dp의 크기를 c+100으로 한다. 100의 이유는 100명보다 작거나 같게만 고객의 수가 비용에 따라 증가할 수 있기 때문이다.
입력받은 (비용과 고객의 수)리스트를 돈다. (첫번째 for문)
입력받은 고객의 수에서 시작해서 dp리스트의 끝까지 돈다. (두번째 for문)
최소 고객의 수보다 작게는 증가를 못시키기 때문이다.
dp[i]의 의미는 i 명을 증가시키는데 필요한 돈의 최솟값이다.
점화식 : dp[i] = min(dp[i-custo] + cost , dp[i])
고객을 custo 만큼 늘린 대신 cost를 더한 값과 원래 값중에서 더 저렴한 값으로 갱신한다.
i가 원했던 고객의 수 보다 크보다 같은 경우 값을 갱신한다.
코드 :
if __name__=="__main__" :
c,n = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
ans = int(1e9)
dp = [int(1e9)]*(c+100)
dp[0] = 0
for cost,custo in arr :
for i in range(custo,len(dp)) :
dp[i] = min(dp[i-custo]+cost,dp[i])
if i >=c : ans = min(ans,dp[i])
print(ans)
반응형