-
1106. [Python]호텔Python_알고리즘/Gold IV 2025. 4. 9. 03:20
1. 문제
https://www.acmicpc.net/problem/1106
2. 접근 방법
- 시간 제한: 2초
- 메모리 제한: 128MB
- 배낭 문제
- 다이나믹 프로그래밍
3. 파이썬 코드
import sys input = sys.stdin.readline C, N = map(int,input().split()) dp = [10**9] * (C+101) moneys = [] # 초기 들어온 값들을 dp 에 사람수와 비용으로 초기값 선언 for _ in range(N): cost, people = map(int,input().split()) moneys.append((cost,people)) dp[people] = min(cost,dp[people]) # 이후 C 값은 최대 1000 보다 작고 비용은 100 값보다 작거나 같은 자연수 이므로 범위를 최대 1101로 설정 for i in range(1,C+101): # 현재 비용에서 들어오는 비용 값을 뺀값이 양수면 해당 비용에 대해서 dp 값 갱신해줌 for c, p in moneys: if i - p >= 1: dp[i] = min(dp[i-p]+dp[p],dp[i]) # 고객이 최소 C 명 이상이기 때문에 이후 값들중 최소값 탐색 print(min(dp[C:]))
4. 문제를 풀고난 후 생각
- 범위를 처음 살펴보고 값이 크지 않은 것을 알았고, C의 값이 1000 보다 작은 것을 고려한 후 최대 100원이 더해진 1100 까지가 나올 수 있는 범위의 한계 인 것을 파악했다.
- 이후 그 사람을 모으기 위한 값들에 대해서 dp 리스트를 갱신해주는 방법으로 문제를 풀었다.
- 문제에서 요구한 조건은 최소 C 명 이상이 될때 최소 비용은 얼마인지 였으므로 출력단에서 C 부터 끝 범위까지 했을때 최소비용을 찾아서 출력해주면 된다.
5. 문제를 푸는데 도움이 되는 지식
- 배낭 문제
'Python_알고리즘 > Gold IV' 카테고리의 다른 글
1744. [Python]수 묶기 (0) 2025.04.06 14502. [Python]연구소 (0) 2024.10.17 2631. [Python]줄세우기 (0) 2024.10.12 10159. [Python]저울 (0) 2024.09.19 17404. [Python]RGB거리 2 (2) 2024.09.02