Knapsack ์๊ณ ๋ฆฌ์ฆ - C์ธ์ด
1. Knapsack ์๊ณ ๋ฆฌ์ฆ
2. ์ฝ๋ ๊ตฌํ
์๊ณ ๋ฆฌ์ฆ ๋ณต์ตํ๊ธฐ ์ํด ํฌ์คํ ํ๊ณ ์์ต๋๋ค.
1. Knapsack ์๊ณ ๋ฆฌ์ฆ
๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)์ ์ ํ๋ ์ฉ๋์ ๊ฐ์ง ๊ฐ๋ฐฉ์ ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๊ฑด์ ๋ฃ์ ๋, ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ์ต์ ํ ๋ฌธ์ ์ ๋๋ค. ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ข ๋ฅ์๋ 0/1 ๋ฐฐ๋ญ ๋ฌธ์ (DP)์ ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ ๋ฌธ์ (๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ)๊ฐ ์์ต๋๋ค.
ํด๋น ํฌ์คํ ์์๋ DP๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
2. ์ฝ๋ ๊ตฌํ
- ์ ์ฒด ์ฝ๋
#include <stdio.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int knapSack(int W, int wt[], int val[], int n) {
int i, w;
int K[n + 1][W + 1];
for (i = 0; i <= n; i++) {
for (w = 0; w <= W; w++) {
if (i == 0 || w == 0){
K[i][w] = 0;
} else if (wt[i - 1] <= w){
K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
} else {
K[i][w] = K[i - 1][w];
}
}
}
return K[n][W];
}
int main() {
int val[] = {10, 40, 30, 50};
int wt[] = {5, 4, 6, 3};
int W = 10;
int n = 4;
printf("์ต๋ ๊ฐ์น: %d\n", knapSack(W, wt, val, n));
return 0;
}
- DP ํต์ฌ ์ฝ๋ ์ค๋ช
else if (wt[i - 1] <= w) {
K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
}
1. ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ์ ๊ฒฝ์ฐ val[i-1] + K[i-1][w - wt[i-1]]
ํ์ฌ ๋ฌผ๊ฑด์ ๊ฐ์น val[i-1]๋ฅผ ๋ํ ํ, ๋จ์ ๋ฌด๊ฒ w - wt[i-1]์์ ์ป์ ์ ์๋ ์ต๋ ๊ฐ์น K[i-1][w - wt[i-1]]๋ฅผ ๋ํฉ๋๋ค.
2. ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ์ง ์์ ๊ฒฝ์ฐ K[i-1][w]
์ด์ ์์ดํ ๊น์ง ๊ณ ๋ คํ ์ํ๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
3. ์ต์ ์ ํด ์ ํ
์์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ ์ค ๋ ํฐ ๊ฐ์ ์ต์ ์ ํด๋ก ์ ํํฉ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)
Knapsack Problem Knapsack Problem, ๋ฐฐ๋ญ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ๋งค์ฐ ์ ๋ช ํ ๋ฌธ์ ์ด๋ค. ์ด๋ค ๋ฐฐ๋ญ์ด ์๊ณ ๊ทธ ๋ฐฐ๋ญ์์ ๋ฃ์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ๊ฐ K๋ผ๊ณ ํ์. ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ N๊ฐ์ ๋ฌผ๊ฑด์ด
jeonyeohun.tistory.com
๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ !
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค <3
'๐ก Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Sort] ์ ๋ ฌ (0) | 2025.02.03 |
---|---|
[Subsequence] LIS์ LCS (0) | 2025.02.03 |
[Graph] ๊น์ด ์ฐ์ ํ์(DFS)๊ณผ ๋๋น ์ฐ์ ํ์(BFS) (0) | 2025.02.03 |
[Greedy] Knanspack ์๊ณ ๋ฆฌ์ฆ - C์ธ์ด (0) | 2025.02.03 |
[DP] ๋์ ๊ณํ๋ฒ(Dynamic Programming) (0) | 2025.01.24 |