Knapsack ์๊ณ ๋ฆฌ์ฆ - C์ธ์ด
1. Knapsack ์๊ณ ๋ฆฌ์ฆ
2. ์ฝ๋ ๊ตฌํ
์๊ณ ๋ฆฌ์ฆ ๋ณต์ตํ๊ธฐ ์ํด ํฌ์คํ ํ๊ณ ์์ต๋๋ค.
1. Knapsack ์๊ณ ๋ฆฌ์ฆ
๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)์ ์ ํ๋ ์ฉ๋์ ๊ฐ์ง ๊ฐ๋ฐฉ์ ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๊ฑด์ ๋ฃ์ ๋, ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ์ต์ ํ ๋ฌธ์ ์ ๋๋ค. ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ข ๋ฅ์๋ 0/1 ๋ฐฐ๋ญ ๋ฌธ์ (DP)์ ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ ๋ฌธ์ (๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ)๊ฐ ์์ต๋๋ค.
ํด๋น ํฌ์คํ ์์๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
2. ์ฝ๋ ๊ตฌํ
- ์ ์ฒด ์ฝ๋
#include <stdio.h>
#include <stdlib.h>
typedef struct Bag {
int value;
int weight;
float ratio;
} Bag;
int compare(const void *a, const void *b) {
Bag *bag1 = (Bag *)a;
Bag *bag2 = (Bag *)b;
if (bag1->ratio < bag2->ratio) {
return 1;
} else if (bag1->ratio > bag2->ratio) {
return -1;
}
return 0;
}
float knapSack(int W, Bag bag[], int n) {
for (int i = 0; i < n; i++) {
bag[i].ratio = (float)bag[i].value / bag[i].weight;
}
qsort(bag, n, sizeof(Bag), compare);
float totalValue = 0.0;
int currentWeight = 0;
for (int i = 0; i < n; i++) {
if (currentWeight + bag[i].weight <= W) {
currentWeight += bag[i].weight;
totalValue += bag[i].value;
} else {
int remainingWeight = W - currentWeight;
totalValue += bag[i].value * ((float)remainingWeight / bag[i].weight);
break;
}
}
return totalValue;
}
int main() {
int val[] = {10, 40, 30, 50};
int wt[] = {5, 4, 6, 3};
int W = 10;
int n = 4;
Bag bag[n];
for (int i = 0; i < n; i++) {
bag[i].value = val[i];
bag[i].weight = wt[i];
}
printf("์ต๋ ๊ฐ์น: %.2f\n", knapSack(W, bag, n));
return 0;
}
- ๊ทธ๋ฆฌ๋ ํต์ฌ ์ฝ๋ ์ค๋ช
1. bag[i].ratio = (float)bag[i].value / bag[i].weight;
๊ฐ์น/๋ฌด๊ฒ ๋น์จ์ ๊ณ์ฐํฉ๋๋ค.
2. qsort(bag, n, sizeof(Bag), compare);
๋ฌผ๊ฑด์ ๊ฐ์น/๋ฌด๊ฒ ๋น์จ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํฉ๋๋ค.
๋น์จ์ด ๋์ ๋ฌผ๊ฑด์ ๋จผ์ ๋ด๊ณ ์ด๋ ๊ฒ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ๋ฌผ๊ฑด์ ํ๋ ์ฉ ์ ํํ๋ฉด์ ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋์ง ์ฒดํฌํฉ๋๋ค.
3. if (currentWeight + bag[i].weight <= W)
๋ฐฐ๋ญ์ด ํด๋น ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋์ง ํ์ธํฉ๋๋ค.
๋ฐฐ๋ญ์ ์ต๋ ํ์ฉ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ์ง ์๋๋ค๋ฉด ๊ทธ๋๋ก ์ถ๊ฐํฉ๋๋ค.
4. int remainingWeight = W - currentWeight; totalValue += bag[i].value * ((float)remainingWeight / bag[i].weight);
๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ์ ์ฒด์ ์ผ๋ก ๋ด์ ์ ์์ ๊ฒฝ์ฐ ์ผ๋ถ๋ง ๋ด์ ์ ์์ต๋๋ค.
์ด๋ ๋ฐฐ๋ญ์ ์ต๋ ๋ฌด๊ฒ(W)์์ ํ์ฌ ๋ฐฐ๋ญ์ ๋ด๊ธด ์ด ๋ฌด๊ฒ(currentWeight)๋ฅผ ๋นผ์ ๋ฐฐ๋ญ์ ๋จ์ ์๋ ๊ณต๊ฐ์ ํฌ๊ธฐ(remainingWeight)๋ฅผ ๊ตฌํฉ๋๋ค. ๊ทธ ํ ์ ์ฒด ๋ฌผ๊ฑด์ ๋ค ๋ฃ์ ์ ์๋ค๋ฉด ์ผ๋ถ๋ง ๋ฃ๊ณ ๊ทธ์ ๋น๋กํ ๊ฐ์น๋ง ์ถ๊ฐํฉ๋๋ค.
๋ฐฐ๋ญ์ ์ต๋ ๋ฌด๊ฒ๊ฐ 10kg์ด๊ณ , ํ์ฌ ๋ฐฐ๋ญ์ ๋ด๊ธด ๋ฌด๊ฒ๊ฐ 8kg์ธ ์ํฉ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
์ด๋ ์๋ก์ด ์์ดํ ์ ๋ฌด๊ฒ๋ 5kg, ์์ดํ ์ ๊ฐ์น๋ 100์ ๋๋ค.
์ด ๊ฒฝ์ฐ์ ๋ฐฐ๋ญ์๋ 2kg๊ฐ ๋จ์์๊ณ , ์์ดํ ์ ๋ฌด๊ฒ๋ 5kg์ด๊ธฐ ๋๋ฌธ์ ์ ๋ถ ๋ฃ์ ์ ์์ต๋๋ค.
์ด๋ ์์ดํ ์ ์ผ๋ถ๋ง ๋ฃ๊ณ , ๊ทธ์ ํด๋นํ๋ ๊ฐ์น๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์ !
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค <3
'๐ก Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Sort] ์ ๋ ฌ (0) | 2025.02.03 |
---|---|
[Subsequence] LIS์ LCS (0) | 2025.02.03 |
[Graph] ๊น์ด ์ฐ์ ํ์(DFS)๊ณผ ๋๋น ์ฐ์ ํ์(BFS) (0) | 2025.02.03 |
[DP] Knapsack ์๊ณ ๋ฆฌ์ฆ - C์ธ์ด (0) | 2025.01.24 |
[DP] ๋์ ๊ณํ๋ฒ(Dynamic Programming) (0) | 2025.01.24 |