๋์ด๋ | ์ ๋ต๋ฅ |
โ โ โ | -% |
ํ๋ฆฌ๋ฏธ์ ์๊ณ ๋ฆฌ์ฆ ์ํด๋ฆฌ ๋นํ์๊ณ ์์ฆ3 4์ฃผ์ฐจ
๋ฌธ์
์์ฐ ๊ฐ๋ฅํ ์ธ๊ตฌ ์๊ฐ ์ฃผ์ด์ก์ ๋ ์ต์ํ์ ์ ๋์ ์ด์ฉํ์ฌ ํด๋น ์ธ๊ตฌ ์๋ฅผ ์ ํํ ๋ง์ถ๋ ์ฌ๋์ด ์น๋ฆฌํ๋ค. '๋ณ๋ค์ ์ ์'์ ๋ชจ๋ ์ ๋์๋ ์ธ๊ตฌ ์๋ผ๋ ์์น๊ฐ ์ฃผ์ด์ก์ผ๋ฉฐ, ์ ๋์ ์์ฐํ ๋ ๊ทธ ์ ๋์ ๋ง๋ ์ธ๊ตฌ ์๋งํผ ์ธ๊ตฌ ์๊ฐ ์ฆ๊ฐํ๋ค.
ํน์ ์ข ์กฑ์ ์ ๋๋ค์ ์์ฐํ๋ฉด ์ธ๊ตฌ ์๋ฅผ ์ฐจ์งํ๋์ง, ์น๋ฆฌํ๋ฅผ ์ํด ํ์ํ ์ธ๊ตฌ ์๊ฐ ๋ช์ธ์ง ์ฃผ์ด์ก์ ๋, ์์ฐํด์ผ ํ๋ ์ต์ ์ ๋ ์๋ฅผ ๊ตฌํด๋ณด์!
ํด๋น ์ข ์กฑ์ ์ ๋์ N(1 ≤ N ≤ 100), ์น๋ฆฌ๋ฅผ ์ํด ํ์ํ ์ธ๊ตฌ ์ K(1 ≤ K ≤ 10,000)
ํด๊ฒฐ
key point, dp[i] = dp[i-unit] + 1
- '์ ๋์ ์์ฐํ์ ๋ ์ผ๋ง๋งํผ์ ์ธ๊ตฌ ์๋ฅผ ์ฐจ์งํ๋ ๊ฐ'๊ฐ ์ฃผ์ด์ก์ ๋ units์ ๋ฃ์ด๋๊ณ
- units์ ์ ๋ ฌํ ํ ์ค๋ณต์ด ์๋ค๋ฉด ์ ๊ฑฐํ๋ค.
๐ ๋ ๊ฐ์ ๋ค๋ฅธ ์ ๋์ด ๊ฐ์ ์ธ๊ตฌ ์๋ฅผ ์ฐจ์งํ๋ค๋ฉด ํ๋์ ์ ๋์ผ๋ก ๋ฐ๊พผ ํ ์ต์ ์ ๋ ์๋ฅผ ๊ตฌํ๋ค. - dp[i]๋ '์ธ๊ตฌ ์ i๋ฅผ ๋ง๋๋ ์ต์ ์ ๋ ์'์ด๋ค.
- dp[]๋ฅผ ์ ์ํด๋๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค.
- ๊ฐ๊ฐ์ ์ ๋์ ๋ํ์ฌ ์ธ๊ตฌ ์๊ฐ ์์ ๊ฒ ๋ถํฐ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค. → unit (ํ์ฌ ๋ณด๊ณ ์๋ ์ ๋์ ์ธ๊ตฌ ์)
- unit๋ถํฐ k๊น์ง ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค → i (๋ง๋ค๊ณ ์ถ์ ์ธ๊ตฌ ์)
- i์ unit์ด ๊ฐ๋ค๋ฉด, ์ ๋์ ์ธ๊ตฌ ์์ ๋ง๋ค๊ณ ์ถ์ ์ธ๊ตฌ ์๊ฐ ๊ฐ๋ค๋ ๊ฒ์ผ๋ก ์ ๋ ํ ๊ฐ๋ก ๋ง๋ค ์ ์๋ค.
- ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋, ์ ๋์ ์ธ๊ตฌ ์๋ก i๋ฅผ ๋ง๋๋ ์ต์ ์ ๋ ์๋ 'i-unit๊ฐ์ ์ธ๊ตฌ๋ฅผ ๋ง๋๋ ์ต์ ์ ๋ ์'์ 1์ ๋ํ ๊ฒ๊ณผ ๊ฐ๋ค.
๐ 1์ ๋ํ๋ ์ด์ ๋ dp[unit]์ ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์๋ฐ ์ด์ฐจํผ dp[unit]์ ์์ i==unit์ ๊ฒฝ์ฐ์ ๊ฐ์ผ๋ฏ๋ก ํญ์ 1์ด๋ค.
- ์ด๋ ๊ฒ unit์ผ๋ก i๋ฅผ ๋ง๋๋ ์ต์ ์ ๋ ์๋ โก dp[i] = dp[i-unit] + 1 โก๊ฐ ๋๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k, dp[10005];
vector<int> units;
int main() {
scanf("%d%d", &n, &k);
for (int i = 0, a; i < n; i++) {
scanf("%d", &a);
units.push_back(a);
}
sort(units.begin(), units.end());
units.erase(unique(units.begin(), units.end()), units.end());
for (auto unit : units) {
for (int i = unit; i <= k; i++) {
if (i == unit)dp[i] = 1;
else if (dp[i - unit] > 0) dp[i] = dp[i] ? min(dp[i], dp[i - unit] + 1) : dp[i - unit] + 1;
}
}
printf("%d", dp[k] ? dp[k] : -1);
return 0;
}
|
cs |
ํ๊ธฐ
์ ๋ช ํ ๋์ ๋ฌธ์ ์ ๋น์ทํ๋ค๊ณ ์๊ฐํด์ ๋นจ๋ฆฌ ํ๊ธดํ์ง๋ง ์ฒ์ ์ฝ๋๋ runtime error๊ฐ ๋ฌ๋ค..
๋ค๋ฅธ ์ ์ unit์ ๋ํด์ ์ธ๊ตฌ ์ k๋ฅผ ๋ฐ๋ณตํ ๊ฒ์ธ์ง, k์ ๋ํด์ unit์ ๋ฐ๋ณตํ ๊ฑด์ง ๋ฐ๋ณต๋ฌธ ์์๋ง ๋ค๋ฅธ๋ฐ..
์ด์ ๋ ์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
ํน์ ์ runtime error์ธ์ง ์๊ฒ ๊ฑฐ๋ ์์ฌ์ด ๊ฐ๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์!
1
2
3
4
5
6
7
|
for (int i = units[0]; i <= k; i++) {
for (auto unit : units) {
if (i - unit < 0) continue;
if (i == unit) dp[i] = 1;
else if (dp[i - unit] > 0) dp[i] = dp[i] ? min(dp[i], dp[i - unit] + 1) : dp[i - unit] + 1;
}
}
|
cs |
'๐ฅ PS(Problem Solving) ๐ฅ > goorm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ตฌ๋ฆLEVEL] ๋ฒฝ ํต๊ณผํ๊ธฐ (0) | 2020.03.25 |
---|---|
[๊ตฌ๋ฆLEVEL] ๋ฏธ๋ก์ฐพ๊ธฐ (0) | 2020.03.24 |
[๊ตฌ๋ฆLEVEL] ์ ์ต์ (0) | 2020.03.23 |
[๊ตฌ๋ฆLEVEL] ๋ฐฑ์ (0) | 2020.03.23 |
[๊ตฌ๋ฆLEVEL] Dance Dance Revolution (0) | 2020.03.23 |
๋๊ธ