[๋ฌธ์ ]
[๋ฌธ์ ์ค๋ช
]
n๊ฐ์ง์ ๋์ ์ด ์์ ๋, ์ด ๋์ ๋ค์ ์ ๋นํ ํฉ์ณ์ k์์ด ๋๊ฒ ํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋ ๊ฒ.
[ํ์ด]
Bottom-up ๋ฐฉ์์ผ๋ก 1์ ๋ง๋๋ ๋ฐฉ๋ฒ, 2๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ, 3์ ๋ง๋๋ ๋ฐฉ๋ฒ, ... 10์ ๋ง๋๋ ๋ฐฉ๋ฒ๊น์ง ๊ตฌํ ๊ฒ์ด๋ค.
์ด ๋, 2,3,...์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ด์ ์ ๊ตฌํ ๊ฐ์ ์ด์ฉํ ๊ฒ์ด๋ค.
๋ฌธ์ ์์ ์ฃผ์ด์ง 1,2,5 ๋์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด,
1,2,5๋ก 1์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1 ํ๊ฐ์ง์ด๋ค.
1,2,5๋ก 2๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1+1, 2๋ก ๋๊ฐ์ง์ด๋ค.
1,2,5๋ก 3์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1+1+1, 1+2๋ก ๋๊ฐ์ง์ด๋ค.
1,2,5๋ก 4๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1+1+1+1, 1+1+2, 2+2๋ก ์ธ๊ฐ์ง์ด๋ค.
1,2,5๋ก 5๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ 1+1+1+1+1, 1+1+1+2, 1+2+2, 5๋ก ๋ค๊ฐ์ง์ด๋ค.
...
์ ๊ฒฝ์ฐ์ ์๋ฅผ ์์ธํ ๋ณด๋ฉด, 1๋ก ๋ง๋ ๊ฒฝ์ฐ์ ์๋ 1~5๊น์ง์ ์๊ฐ ๋ชจ๋ ํฌํจํ๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ 1~5 ์ค์ 2๊ฐ ํฌํจ๋ ์ ์๋ ๊ฒฝ์ฐ์ 2๋ฅผ ํฌํจ์์ผ์ ๋ง๋ค์๊ณ ,
1~5 ์ค์ 5๊ฐ ํฌํจ๋ ์ ์๋ ๊ฒฝ์ฐ์ 5๋ฅผ ํฌํจ์์ผ์ ๋ง๋ค ์ ์๋ค.
์ฆ 1์์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋จผ์ ๋ํ๊ณ
DP[1] = 1 (1)
DP[2] = 1 (11)
DP[3] = 1 (111)
DP[4] = 1 (1111)
DP[5] = 1 (11111)
2์์ ์ถ๊ฐํด์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํด์ ๋ํ๊ณ
DP[1] = 1 (1)
DP[2] = 1+1 (11,2)
DP[3] = 1+DP[1] = 2 (111,12)
DP[4] = 1+DP[2] = 3 (1111,112,22)
DP[5] = 1+DP[3] = 3 (11111,1112,122)
5์์ ์ถ๊ฐํด์ ๋ง๋ค์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด์ ๋ํ๋ฉด ๋๋ค.
DP[1] = 1 (1)
DP[2] = 2 (11,2)
DP[3] = 2 (111,12)
DP[4] = 3 (1111,112,22)
DP[5] = 3+1 = 4 (11111,1112,122,5)
์ด ๋ด์ฉ์ ์ ํ์์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
dp[x] = y; // y๋ ์ฃผ์ด์ง ๋์ ๋ค๋ก x๋ฅผ ๋ง๋ค ๋์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ปํจ.
dp[1] = 1 (1)
dp[2] = 2 (1+1, 2)
dp[3] = 2 (1+1+1, 1+2)
dp[4] = 3 (1+1+1+1, 1+1+2, 2+2)
dp[5] = 4 (1+1+1+1+1, 1+1+1+2, 1+2+2, 5)
...
dp[0] = 1;
for (int coin_idx = 0; coin_idx < coin_num; coin_idx++) { //1,2,5
for (int i = 1; i <= value; i++) { //1~10
if (i - coins[coin_idx] >= 0) {//1-1 >=0, 2-1>=0, 2-2>=0, 3-1>=0, 3-2>=0, 4-1>=0, 4-2>=0
dp[i] += dp[i - coins[coin_idx]];
}
}
์ฐธ๊ณ ๋ก ์์ ์ '1๋ก ๋ง๋ค๊ธฐ'๋ผ๋ ๋ฌธ์ ์์ 2 -> 1๋ก 3 -> 1๋ก 4 -> 1๋ก ๋ง๋๋ ๊ณผ์ ์ ๊ตฌํ ์ ์ด ์๋ค.
์ด ๋๋ ์์์ ๊ตฌํ ๊ฐ์ ์ด์ฉํด์ bottom-up ๋ฐฉ์์ผ๋ก ๊ตฌํ์๋ค.
๊ทธ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฐ์ 1๋ก ๋ง๋ค ๋, 2๋ก ๋๋๊ธฐ, 3์ผ๋ก ๋๋๊ธฐ, 1๋นผ๊ธฐ ์ 3๊ฐ์ง ๋ฐฉ์ ์ค์ ๊ฐ๋ฅํ ํ๋๋ฅผ ํํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.
for (int i = 2; i <= num; i++) {
minCountArr[i] = minCountArr[i - 1] + 1;
if (i % 2 == 0) minCountArr[i] = min(minCountArr[i / 2] + 1, minCountArr[i]);
if (i % 3 == 0) minCountArr[i] = min(minCountArr[i / 3] + 1, minCountArr[i]);
}
๋์ ๋ฌธ์ ๋ 1๋ก ๋ง๋ค๊ธฐ์ ์ ์ฌํ ๋ฌธ์ ๋ผ ํ ์ ์๋ค.
[์ฝ๋]
#include <iostream>
#include <vector>
using namespace std;
int main() {
int coin_num, value; //1 ≤ coin_num ≤ 100, 1 ≤ value ≤ 10,000
vector<int> coins;
cin >> coin_num >> value;
for (int i = 0; i < coin_num; i++) {
int coin;
cin >> coin;
coins.push_back(coin);
}
int *dp = new int[value + 1]();
dp[0] = 1;
for (int coin_idx = 0; coin_idx < coin_num; coin_idx++) { //1,2,5
for (int i = 1; i <= value; i++) { //1~10
if (i - coins[coin_idx] >= 0) {
dp[i] += dp[i - coins[coin_idx]];
}
}
}
cout << dp[value] << "\n";
delete[] dp;
return 0;
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][ํ๋ก๊ทธ๋๋จธ์ค][Heap] ๋ ๋งต๊ฒ (0) | 2021.09.22 |
---|---|
[C++][BAEKJOON][๋ธ๋ฃจํธํฌ์ค] 3085๋ฒ ์ฌํ ๊ฒ์ (0) | 2021.09.21 |
[C++][BAEKJOON][์๋ฎฌ๋ ์ด์ ] 17144๋ฒ ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2021.09.19 |
[C++][BAEKJOON][DP] 9456๋ฒ ์คํฐ์ปค (0) | 2021.08.22 |
[C++][ํ๋ก๊ทธ๋๋จธ์ค] ๊ดํธ ๋ณํ (0) | 2021.08.22 |