민규가 구매하려고 하는 카드의 개수 N과 카드 팩의 가격이 주어졌을 때, N개의 카드를 구매하기 위해 민규가 지불해야 하는 금액의 최솟값을 구하시오.
max()
함수를 min()
함수로 변경하는 것이 답이 아니다. 초기값이 중요하다. 왜냐하면 초기값이 0
으로 설정되어있으므로 min()
함수를 써도 항상 답은 0이 나오기 때문이다. 따라서 초기값을 잘 설정해주는게 중요하다.min()
함수를 사용하지 않는 방법도 있다.#include <iostream>
#include <vector>
using namespace std;
static int N = 0;
static vector<int> dp(1001, -1);
int solve(const vector<int>& card) {
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= i; ++j)
if (dp[i] == -1 || dp[i] > dp[i - j] + card[j])
dp[i] = dp[i - j] + card[j];
return dp[N];
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N;
vector<int> card(N + 1);
for (int i = 1; i <= N; ++i) cin >> card[i];
cout << solve(card) << '\n';
}
또는
#include <iostream>
#include <vector>
using namespace std;
static int N = 0;
static vector<int> dp(1001, 1000*10000);
int solve(const vector<int>& card) {
dp[0] = 0;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= i; ++j)
dp[i] = min(dp[i], dp[i - j] + card[j]);
return dp[N];
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N;
vector<int> card(N + 1);
for (int i = 1; i <= N; ++i) cin >> card[i];
cout << solve(card) << '\n';
}