๋ฌธ์
https://www.acmicpc.net/problem/12865
๋ฌธ์ ์ดํด
- ์ต๋ ๋ฌด๊ฒ(K)๊ฐ ์ ํด์ง ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ๋๋ค.
- N๊ฐ์ ๋ฌผ๊ฑด์๋ ๊ฐ๊ฐ ๋ฌด๊ฒ(W)์ ๊ฐ์น(V)๊ฐ ์๋ค.
- ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ๋ฌผ๊ฑด๋ค์ ๊ฐ์นํฉ์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
๋ฌธ์ ํ์ด
โ ๋ธ๋ฃจํธํฌ์ค
- ๋ฌผ๊ฑด์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ๋ค.
- N๊ฐ์ ๋ฌผ๊ฑด์ ๋ํด ๋ฃ์์ง ๋ง์ง๋ฅผ ๋ชจ๋ ์๋ํ๋ค.
- O(2^N)์ด๊ณ , N ≤ 100์ด๋ฏ๋ก ์ ํ์๊ฐ ์ด๊ณผ
โ ๋ฐฑํธ๋ํน
- ๋ฌผ๊ฑด์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๊ตฌํ๋ฉด์ ์ต๋ ๋ฌด๊ฒ๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง์น๊ธฐ๋ก ์ค์ธ๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ๋ก, ๋ชจ๋ ์กฐํฉ์ด ์ต๋ ๋ฌด๊ฒ๋ฅผ ๋์ด๊ฐ์ง ์์ผ๋ฉด, ๋ธ๋ฃจํธํฌ์ค์ ๊ฐ์์ง๋ค.
๐ก Dynamic Programming
DP๋ฅผ ํตํด ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด์ ์ค๋ณต ๊ณ์ฐ์ ํผํ๋ค.
- '๋ฐฐ๋ญ์ ์ต๋ ๋ฌด๊ฒ'๋ฅผ ์ธ๋ฑ์ค๋ก, ๊ฐ์นํฉ์ ์ต๋๊ฐ์ ์ ์ฅํ๋ค.
- N๊ฐ์ ๋ฌผ๊ฑด์ ํ์ํ๋ฉด์, ํ์ฌ ๋ฌผํ์ ๋ฐฐ๋ญ์ ๋ฃ๋ ๊ฒฝ์ฐ, ๋ฃ์ง ์๋ ๊ฒฝ์ฐ ์ค์ ์ต๋๊ฐ์ ์ ์ฅํ๋ค.
- ๋ฐฐ๋ญ์ ๋ฃ๋ ๊ฒฝ์ฐ: ํ์ฌ ๋ฌผํ์ ๋ฌด๊ฒ๋ฅผ ๋บ์ ๋ ๊ฐ์นํฉ์ ์ต๋๊ฐ + ํ์ฌ ๋ฌผํ์ ๊ฐ์น
๋ฐฐ๋ญ์ ๋ฃ์ง ์๋ ๊ฒฝ์ฐ: ๊ธฐ์กด์ ์ ์ฅ๋์ด ์๋ ๊ฐ
๐ก DP ์ ํ์
๊ฐ i๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ํด, ๋ฌด๊ฒ j์์ ์ต๋ ๊ฐ์น๋ฅผ ๊ฐฑ์ ํ๋ค. (๋ฌผ๊ฑด ๋ฒ์: 0 ~ N / ๋ฌด๊ฒ ๋ฒ์: 0 ~ K)
// j >= item[i].w
dp[i][j] = max(dp[i - 1][j - item[i].w] + item[i].v, dp[i - 1][j])
ํด๋น ๋ฌผํ์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด, ๊ฐ ๋ฌผํ์ ํ์ผ๋ก ๊ตฌ๋ถํด์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฐ๋ฐ ์ญ์์ผ๋ก ์ ์ฅํ๋ฉด 1์ฐจ์ ๋ฐฐ์ด๋ก ๊ตฌํํ ์ ์๋ค.
dp[j] = max(dp[j - item[i].w] + item[i].v, dp[j])
๐ ๋ ์ ๋ฌธ์ (Knapsack Problem)
- 0-1 Knapsack
- ๊ฐ ๋ฌผ๊ฑด์ ํ ๋ฒ๋ง ์ ํ ๊ฐ๋ฅ
- "๋ฃ๊ฑฐ๋ ๋ง๊ฑฐ๋" → ์ ํ์ง๋ 0 ๋๋ 1
- Unbounded Knapsack: ๊ฐ์ ๋ฌผ๊ฑด์ ์ฌ๋ฌ ๋ฒ ๋ฃ์ ์ ์์ (ex. ๋์ ๋ฌธ์ )
- Fractional Knapsack: ๋ฌผ๊ฑด์ ์ชผ๊ฐ์ ๋ฃ์ ์ ์์
์ด ๋ฌธ์ ๋ 1๋ฒ์ ํด๋นํ๋ค.
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
struct info {
int w, v;
};
int knapsack(int n, int k, vector<info> &item) {
vector<int> dp(k + 1, 0);
for (int i = 0; i < n; i++) {
for (int j = k; j >= item[i].w; j--)
dp[j] = max(dp[j], dp[j - item[i].w] + item[i].v);
}
return dp[k];
}
int main() {
int n, k;
vector<info> item;
// ์
๋ ฅ
cin >> n >> k;
item.assign(n, {0, 0});
for (int i = 0; i < n; i++)
cin >> item[i].w >> item[i].v;
// ์ถ๋ ฅ
cout << knapsack(n, k, item);
return 0;
}
'๐ญ Problem Solving > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 9084๋ฒ: ๋์ (0) | 2025.05.22 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 11559๋ฒ: Puyo Puyo (0) | 2025.05.18 |
[BOJ][C++] ๋ฐฑ์ค 2606๋ฒ: ๋ฐ์ด๋ฌ์ค (0) | 2025.05.13 |
[BOJ][C++] ๋ฐฑ์ค 1303๋ฒ: ์ ์ - ์ ํฌ (0) | 2025.04.23 |
[BOJ][C++] ๋ฐฑ์ค 1890๋ฒ: ์ ํ (0) | 2025.04.23 |