Notice
Recent Posts
Recent Comments
Link
Tags
- ์ฌ๊ท
- ์นด์นด์ค ์ฝํ
- go
- ์ํฐ๋
- DP
- ๋นํธ๋งต
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- LCs
- ์นด์นด์ค2021
- js
- nestjs
- ์น๋ฆฐ์ด
- ์์ฝ๋
- ํธ๋ฆฌ
- ๋ค์ต์คํธ๋ผ
- ํ๋ฆฌ์จ๋ณด๋ฉ
- BFS
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๊ณ ๋ฆฌ์ฆ
- ์ด๋ถํ์
- golang
- ๋ฐฑ์ค
- DFS
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- C++
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋นํธ๋ง์คํน
- Python
- Union-Find
Archives
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 12865. ํ๋ฒํ ๋ฐฐ๋ญ ๋ณธ๋ฌธ
๋ฐ์ํ
๋ฌธ์
ํ์ด
์ฒ์์๋, DP๋ฅผ ์ด๋ป๊ฒ ์ด์ฉํด์ผํ ์ง ๋ ์ค๋ฅด์ง ์์์ ์ผ๋จ ์์ ํ์์ผ๋ก ๊ตฌํํด๋ณด์๋ค.
๊ฒฐ๊ณผ๋ ๋๋ฌด ๋น์ฐํ๊ฒ๋ ์๊ฐ์ด๊ณผ์๋ค!
์์ ํ์์ผ๋ก ๊ตฌํํ๊ณ ๋๋ฉด, DP์ ๋ํ ๊ฐ์ด ์ฌ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ ํ ์ค์ง ์์๋ค.
๊ฒฐ๊ตญ ๊ฒ์์ ํ์ ๋น๋ ธ๋๋ฐ, ์ด ๋ฌธ์ ๋ ๋ํ์ ์ธ "๋ ์ ๋ฌธ์ "๋ผ๊ณ ํ๋ค.
๋ ์ ๋ฌธ์ (knapsack problem)๋?
๋ ์ ๋ฌธ์ ๋ฅผ ์์๋ฃ๊ธฐ ์ฝ๊ฒ ํํํ๋ฉด, "๋ฐฐ๋ญ ์ฑ์ฐ๊ธฐ ๋ฌธ์ "์ด๋ค.
์ฆ, ์ฃผ์ด์ง ์กฐ๊ฑด ํ์์ ์ต๋ํ์ผ๋ก ๋ฐฐ๋ญ์ ์ฑ์ฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ? ์ ๋ํ ๋ฌธ์ ์ด๋ค.
ํ์ด๋ฒ
- ์์ ํ์
- ๋ณต์ก๋ : O(N^2) -> ์๊ฐ์ด๊ณผ ๊ฐ๋ฅ์ฑ
- Greedy
- ํญ์ ์ต์ ์ ๋ต์ด๋ผ๋ ๋ณด์ฅ์ด ์๋ค
- DP
- ์ด๋ค ๋ฌธ์ ์ DP๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ๋ฌธ์ ์ ์ต์ ์ ์๋ฆฌ๊ฐ ์ฑ๋ฆฝ๋์ด์ผ ํ๋ค.
- ์ต์ ์ ์๋ฆฌ? : ์ด๋ ํ ๊ฒฝ์ฐ์ ์ต์ ์ ํด๊ฐ, ์ด ๊ฒฝ์ฐ๋ฅผ ๋ถํ ํ ๋ถ๋ถ ์ฌ๋ก์ ๋ํ ์ต์ ํด๋ฅผ ํญ์ ํฌํจํ๊ณ ์์ผ๋ฉด, ๊ทธ ๋ฌธ์ ์ ๋ํด ์ต์ ์ ์๋ฆฌ๊ฐ ์ฑ๋ฆฝํ๋ค.
- ์ด ์๋ฆฌ๋ฅผ ๋
์ ๋ฌธ์ ์ ์ ์ฉํ๋ฉด,
- ์งํฉ A : ๋ ์ ๋ฌธ์ ์ ์ต์ ์ ํด์์ ๊ฐ๋ฐฉ์ ๋ด๊ธด ๋ฌผ๊ฑด๋ค์ ์งํฉ
- ์งํฉ A๊ฐ n๋ฒ์งธ ๋ฌผ๊ฑด์ ํฌํจํ์ง ์๋๋ค๋ฉด,
- A๋ n๋ฒ์งธ ๋ณด์์ ์ ์ธํ ๋๋จธ์ง n-1๊ฐ์ ๋ฌผ๊ฑด๋ค ์ค์ ์ต์ ์ผ๋ก ๊ณ ๋ฅธ ๋ถ๋ถ์งํฉ๊ณผ ๊ฐ๋ค.
- ์งํฉ A๊ฐ n๋ฒ์งธ ๋ฌผ๊ฑด์ ํฌํจํ๋ค๋ฉด,
- A์ ์ํ ๋ฌผ๊ฑด๋ค์ ์ด ๊ฐ๊ฒฉ = n-1๊ฐ์ ๋ฌผ๊ฑด๋ค ์ค์์ ์ต์ ์ผ๋ก ๊ณ ๋ฅธ ๊ฐ๊ฒฉ์ ํฉ + n๋ฒ์งธ ๋ฌผ๊ฑด์ ๊ฐ๊ฒฉ
- ์ด๊ฒ์ ์ ํ์์ผ๋ก ํ์ด์ฐ๋ฉด ์๋์ ๊ฐ๋ค.
- P[i, w] : i๊ฐ์ ๋ณด์, ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ ํ๋ w ์ผ ๋ ์ต๋์ ์ด์ต
- ์ด๋ค ๋ฌธ์ ์ DP๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ๋ฌธ์ ์ ์ต์ ์ ์๋ฆฌ๊ฐ ์ฑ๋ฆฝ๋์ด์ผ ํ๋ค.
์์ ํ์ ์ฝ๋ (์๊ฐ์ด๊ณผ)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int k,n;
int maxV = 0;
vector<vector<int>> objList;
void func(int start, int wSum, int vSum) {
for (int i = start;i < n;i++) {
if (wSum + objList[i][0] > k) {
maxV = max(maxV, vSum);
continue;
}
func(i, wSum + objList[i][0], vSum + objList[i][1]);
}
}
int main(void) {
//n: ๋ฌผ๊ฑด์ ๊ฐ์, k:๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ
cin >> n >> k;
for (int i = 0;i < n;i++) {
int w, v;
cin >> w >> v;
objList.push_back({ w,v });
}
func(0, 0, 0);
cout << maxV << endl;
return 0;
}
DP ์ฝ๋ (์ฑ๊ณต!)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
//n: ๋ฌผ๊ฑด์ ๊ฐ์, k:๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ
int k, n;
vector<vector<int>> objList;
cin >> n >> k;
vector<vector<int>> cache(n+1, vector<int> (k+1));
objList.push_back({0,0});
for (int i = 0;i < n;i++) {
int w, v;
cin >> w >> v;
objList.push_back({ w,v });
}
for (int i = 1;i <= n;i++) {
for (int j = 0;j <= k;j++) {
int weight = objList[i][0];
if (j < weight)
cache[i][j] = cache[i-1][j];
else
cache[i][j] = max(cache[i - 1][j], cache[i - 1][j - weight] + objList[i][1]);
}
}
cout << cache[n][k];
return 0;
}
๊ฒฐ๊ณผ
๋ฐ์ํ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 1005. ACM Craft (0) | 2021.03.24 |
---|---|
[๋ฐฑ์ค/C++] 2225. ํฉ๋ถํด (0) | 2021.03.24 |
[๋ฐฑ์ค/C++] 1520. ๋ด๋ฆฌ๋ง ๊ธธ (0) | 2021.03.14 |
[ํ๋ก๊ทธ๋๋จธ์ค/C++] ํฉ์น ํ์ ์๊ธ (0) | 2021.03.01 |
[๋ฐฑ์ค/C++] 1175. ๋ฐฐ๋ฌ (0) | 2021.02.26 |