๋ฌธ์
๋ฐฑ์ค 13137๋ฒ Exchange Problem
ํด๊ฒฐ ๊ณผ์
1. ๋ฌธ์ ์ดํด
์ด ๋ฌธ์ ๋ DP์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ฌ์ฉํ๋ ๋ฌธ์ ์ด๋ค. ๋จผ์ DP๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๊ณ , ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ์ธ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ด ์ผ์นํ๋์ง ํ์ธํ๋ฉด ๋๋ค.
2. ๋์ ๊ตํ DP ๊ตฌํ
๋จผ์ DP๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ณ์ฐํด๋ณด์. ์ฌ๋ ๋์ ๊ตํ ๋ฌธ์ ์ ๊ฐ์ด, ๋ฅผ ์์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ต์ ๋์ ์ ๊ฐ์๋ผ๊ณ ์ ์ํ์. ๊ทธ๋ฌ๋ฉด ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
์ด๋ ์ด๋ค. ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
vector<int> dp(2 * p[n - 1] + 1);
for (int i = 0; i <= 2 * p[n - 1]; ++i) dp[i] = i;
for (int i = 1; i <= 2 * p[n - 1]; ++i) {
for (int j = 0; j < n; ++j) {
if (p[j] <= i) dp[i] = min(dp[i], dp[i - p[j]] + 1);
}
}3. ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ ๊ตฌํ
๋ค์์ผ๋ก ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ์ ๊ตฌํํด๋ณด์. ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ์ ๋งค ์๊ฐ๋ง๋ค, ๋ ํ์ํ ๋ ์ดํ์ ์ก๋ฉด์ ๊ฐ์ง ๋์ ์ค ๊ฐ์ฅ ์ก๋ฉด์ด ๋์ ๋์ ์ ์ ํํ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
int greedy(int i, int n, vector<int>& p) {
int cnt = 0;
for (int j = n - 1; j >= 0; --j) {
cnt += i / p[j];
i %= p[j];
}
return cnt;
}4. ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ๊ณผ DP์ ๊ฒฐ๊ณผ ๋น๊ต
์ด์ ๋ถํฐ ๊น์ง์ ๋ชจ๋ ๊ธ์ก์ ๋ํด DP๋ก ์ต์ ๋์ ์ ๊ณ์ฐํ๊ณ , ์ดํ ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ์ธ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ด ์ผ์นํ๋์ง ํ์ธํ๋ฉด ๋๋ค.
๋ง์ฝ ์ผ์นํ์ง ์๋๋ค๋ฉด, ๋ณ์ฐฌ์ด์ ๋ฐฉ๋ฒ์ด ์ต์ ์ด ์๋๋ผ๋ ๋ป์ด๋ค.
๋ฐ๋ผ์ false๋ฅผ ๋ฐํํ๊ณ , ์ผ์นํ๋ค๋ฉด true๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
for (int i = 1; i <= 2 * p[n - 1]; ++i) {
if (greedy(i, n, p) != dp[i]) return false;
}
return true;์์ ๋ต์
์์ ๊ณผ์ ์ ์ข ํฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
C++ ์ฝ๋
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int greedy(int i, int n, vector<int>& p) {
int cnt = 0;
for (int j = n - 1; j >= 0; --j) {
cnt += i / p[j];
i %= p[j];
}
return cnt;
}
bool solve(void) {
int n; cin >> n;
vector<int> p(n);
for (int i = 0; i < n; ++i) cin >> p[i];
vector<int> dp(2 * p[n - 1] + 1);
for (int i = 0; i <= 2 * p[n - 1]; ++i) dp[i] = i;
for (int i = 1; i <= 2 * p[n - 1]; ++i) {
for (int j = 0; j < n; ++j) {
if (p[j] <= i) dp[i] = min(dp[i], dp[i - p[j]] + 1);
}
}
for (int i = 1; i <= 2 * p[n - 1]; ++i) {
if (greedy(i, n, p) != dp[i]) return false;
}
return true;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << (solve() ? "Yes" : "No");
return 0;
}- ์ถ์ฒ: Hiyabye/Baekjoon - 13137.cpp
ํจ์จ์ฑ ๋ถ์
| ์๊ฐ ๋ณต์ก๋ | ๊ณต๊ฐ ๋ณต์ก๋ |
|---|---|
๋ฌธ์ ํ์ด ํ
๋ฌธ์ ์์ ๋์ ์ ๋จ์ ์ก๋ฉด ๊ฐ์ ์์ฆ๊ฐ ์์ด์ด๋ผ๊ณ ํ์ผ๋ฏ๋ก ์ ๋ ฌํ ํ์๊ฐ ์๋ค.
DP ์ ํ์ ๋ฌธ์ ๋ฅผ ํ ๋๋, ๋ฌธ์ ์ ์กฐ๊ฑด์ ๊ฐ ์ํ์ ๋ํ ์ ๋ณด๋ก ๋๋์ด ์ ์ฅํ๋ ๊ฒ์ด ์ข๋ค. ์ด ๋ฌธ์ ์์๋ ๋ฅผ ์์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ต์ ๋์ ์ ๊ฐ์๋ก ์ ์ํ๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งค ์๊ฐ๋ง๋ค ์ต์ ์ ์ ํ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ฐ๋ผ์ ๋งค ์๊ฐ๋ง๋ค ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด์.