<모든 코드는 C++를 기반으로 작성되었습니다.>
a 연산
을 수행하는 것이 최선은 아니라는 것을 깨닫는게 핵심이다.#include <iostream>
#include <cstring>
using namespace std;
static int X, dp[30001];
int main() {
cin >> X;
for (int i = 2; i <= X; ++i) {
dp[i] = dp[i - 1] + 1; // d: X에서 1을 뺸다.
if (i % 2 == 0) dp[i] = min(dp[i], dp[i / 2] + 1); // c: 2로 나눈다.
if (i % 3 == 0) dp[i] = min(dp[i], dp[i / 3] + 1); // b: 3으로 나눈다.
if (i % 5 == 0) dp[i] = min(dp[i], dp[i / 5] + 1); // a: 5로 나눈다.
}
cout << dp[X] << '\n';
}
dp
배열을 만들고, i = 2
부터 시작해서 문제의 크기를 늘려나간다.#include <iostream>
using namespace std;
static int N, food[101], cache[101];
int solve(int n) {
if (n <= 0) return 0;
if (cache[n] > 0) return cache[n];
return cache[n] = max(solve(n - 1), solve(n - 2) + food[n]); // 점화식 그대로 사용
}
int main() {
cin >> N;
for (int i = 1; i <= N; ++i) cin >> food[i];
cout << solve(N) << '\n';
}
#include <iostream>
using namespace std;
static int N, dp[1001] = {0, 1, 3, };
int solve(int n) {
if (n <= 0) return 0;
if (dp[n] > 0) return dp[n];
return dp[n] = (solve(n - 1) + solve(n - 2) * 2) % 796796;
}
int main() {
cin >> N;
cout << solve(N) << '\n';
}
#include <iostream>
#include <cstring>
using namespace std;
static int N, M, coin[101], dp[10001];
int main() {
cin >> N >> M;
for (int i = 1; i <= N; ++i) cin >> coin[i];
memset(dp, 10001, sizeof(dp)); // 초기화, 10001을 넘을 수 없다.
dp[0] = 0;
for (int i = 1; i <= N; ++i) // 모든 코인에 대해 검사한다.
for (int j = coin[i]; j <= M; ++j) // 모든 금액에 대해 검사한다.
dp[j] = min(dp[j], dp[j - coin[i]] + 1);
if (dp[M] <= M) cout << dp[M] << '\n'; // 정상 범주라면 답 출력.
else cout << -1 << '\n'; // 비정상 범주라면 불가능이라 판단.
}