๐ฃ ๋ฌธ์ ์ดํด
0-1 Knapsack Problem ๊ณผ ๋์ผํ ๋ฌธ์ ์ด๋ค.
N ๊ฐ์ ๋ฌผ๊ฑด์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ๋ฌด๊ฒ W , ๊ฐ์น V ๋ฅผ ๊ฐ์ง๋ค.
์ต๋ K ๋ฌด๊ฒ๋ฅผ ๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ค๊ณ ํ ๋, ํฌํจํ ๋ฌผ๊ฑด์ ๊ฐ์น V ํฉ์ ์ต๋๋ฅผ ๊ตฌํด์ผํ๋ค.
3ํ๋ ํ๊ธฐ ์ค์ ํ์ด๋ณด์์ง๋ง ๊ฐ๋ฌผ๊ฐ๋ฌผํด์ ์ด ์ธ๊ตญ ์ ํ๋ฒ์ ํ์ด ๊ฐ ์๋นํ ์ ์ตํ๊ธฐ์ ๋ค์ ํ ๋ฒ ์ฐธ๊ณ ํ๋ค.
๋์ ๊ณํ๋ฒ(Dynamic Programming) ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๐ญ ํ์ด ๊ณผ์
dp[i][j] = max(dp[i-1][j] , dp[i][j-index] + value) ์ ์ ํ์์ ๊ฐ์ง๋ค.
1. ๊ฐ๋ฐฉ ๊ณต๊ฐ๋ณด๋ค ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(product[i][1]) ์ด ๋ ํด ๋๋ ํฌํจํ์ง ๋ชปํ๋ฏ๋ก ์ด๋ฅผ ์ ์ธํ ๋ฌด๊ฒ๋ก ๋์ฒดํ๋ค.
2. ๊ฐ๋ฐฉ ๊ณต๊ฐ๋ณด๋ค ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(product[i][1]) ์ด ๋ ์์ ๋๋ ํฌํจ ํ ์๋, ํฌํจํ์ง ์์ ์๋ ์์ผ๋ฏ๋ก ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ฐ์ ธ๋ณด์ ๋ ํฐ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค.
์์ฑ ์ธ์ด: C++
#include <cstdio>
#include <algorithm> // std::max
int dp[101][100001] = {0, }; // 0-1 knapsack problem DP ๋ฐฐ์ด
int product[101][3] = {0, }; // 1์ด์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ, 2์ด์ ๋ฌผ๊ฑด์ ๊ฐ์น
int main(){
int sackCnt, sackWeight;
scanf("%d %d", &sackCnt, &sackWeight);
// ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ๋ญ์ ๋ฌผํ ์, ๋ฐฐ๋ญ์ ์ต๋ ๋ฌด๊ฒ
for (int i = 1; i <= sackCnt; ++i) {
scanf("%d %d", &product[i][1], &product[i][2]);
}
for (int i = 1; i <= sackCnt; ++i) {
for (int j = 0; j <= sackWeight; ++j) {
/* #1# ๊ฐ๋ฐฉ ๊ณต๊ฐ๋ณด๋ค ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(product[i][1]) ์ด ๋ ํด ๋๋ ํฌํจํ์ง ๋ชปํ๋ฏ๋ก
์ด๋ฅผ ์ ์ธํ ๋ฌด๊ฒ๋ก ๋์ฒดํ๋ค.
#2# ๊ฐ๋ฐฉ ๊ณต๊ฐ๋ณด๋ค ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(product[i][1]) ์ด ๋ ์์ ๋๋ ํฌํจ ํ ์๋, ํฌํจํ์ง ์์ ์๋ ์์ผ๋ฏ๋ก
๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ฐ์ ธ๋ณด์ ๋ ํฐ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค. */
if (j < product[i][1]) {
dp[i][j] = dp[i-1][j];
}else {
int minusIdx = j - product[i][1]; // ์ด ๋ฌผ๊ฑด์ ํฌํจํ์ ๋, ๊ฐ๋ฐฉ์ ๋จ์ ๋ฌด๊ฒ
dp[i][j] = std::max(dp[i-1][j], dp[i][minusIdx] + product[i][2]); // ์ด ๋ฌผ๊ฑด์ ํฌํจํ๊ธฐ ์ ๊ณผ ํฌํจํ ํ ์ค ๋ ๊ฐ์น๊ฐ ํฐ ๊ฒ์ ์ ํ
}
}
}
printf("%d\n", dp[sackCnt][sackWeight]);
return 0;
}
๐ ๋ฐฐ์ด ์
0-1 knapsack problem ์ด๋ผ๋ ์ ๋ช ํ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ค์ ํ์์๋๋ฐ ๋ค์ ํ์ด์ ๋ง์ถ๋ ์๋นํ ๋ฟ๋ฏํ๋ค :D
๊ณ์ํด์ ํ๋ค๋ณด๋ฉด ์ด๋ฐ ๊ฒฝํ์ด ๋์ฑ ์์ด๊ฒ ์ง..!