https://www.acmicpc.net/problem/1106
풀이
dp 문제이다.
dp에 많이 약해서 dp 연습을 이제 좀 시작하려고 한다.
얼마나 약하냐면, 골드 4인데도 dp 식이 아직 잘 안떠오른다.
dp리스트는 1차원으로, dp[i] = (정확히 i명 모으는데 드는 최소 비용)이다.
초기에 i = 0을 제외하고는 전부 무한대로 초기화한다.
한 번에 최대 100명까지 들어올 수 있으므로 dp의 길이는 C+100정도면 충분할 것이다.
각 도시별로 다음을 반복하면 된다.
j가 0부터 C+100-gain 인 동안,
dp[j+gain] = min(dp[j+gain], dp[j] + cost)
이게 되는 이유는, j가 0부터 점점 커지므로, 중복이 자연스럽게 카운팅된다. (직접 그려보면 안다.)
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int C; cin >> C;
int N; cin >> N;
int dp[C+100] = {};
for (int i = 1; i < C+100; i++) dp[i] = 999999;
for (int i = 0; i < N; i++) {
int cost, gain; cin >> cost >> gain;
for (int k = 0; k < C+100 - gain; k++) {
dp[k+gain] = min(dp[k+gain], dp[k] + cost);
}
}
int ans = 999999;
for (int i = C; i < C+100; i++) {
ans = min(ans, dp[i]);
}
cout << ans;
}
'PS' 카테고리의 다른 글
[Python] 백준 18122 - 색깔 하노이 탑, 백준 27743 - 어려운 하노이 탑 (0) | 2025.08.18 |
---|---|
[Python] 백준 1086 - 박성원 (1) | 2025.08.05 |
[Python] 백준 16995 - Piece of Cake (2) | 2025.08.02 |
신발끈 공식을 증명해보자 (1) | 2025.08.02 |
[Python] 백준 1492 - 합, 백준 25974 - 거듭제곱의 합 1 (0) | 2025.08.02 |