์ฐ์ ๊ธฐ๋ก ๐ช
[C++ ์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ2 - ๋ฐฐ๋ญ๋ฌธ์ (Knapsack Problem) ๋ณธ๋ฌธ
[C++ ์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ2 - ๋ฐฐ๋ญ๋ฌธ์ (Knapsack Problem)
kite707 2022. 1. 4. 23:54๋ฐฐ๋ญ๋ฌธ์ (Knapsack Problem)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ํ์ ์ธ ์์๋ฌธ์ ์ด๋ค. ํ ์ฌํ๊ฐ๊ฐ ๊ฐ์ง๊ณ ๊ฐ๋ ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ด ์ ํด์ ธ ์๊ณ , ์ผ์ ๊ฐ์น์ ๋ฌด๊ฒ๊ฐ ์๋ ์ง๋ค์ ๋ฐฐ๋ญ์ ๋ฃ์ ๋, ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ์ง์ ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋์ ๊ฐ์ ํ์์ผ๋ก ์ฃผ์ด์ง๋ค.
https://www.acmicpc.net/problem/12865
๋ฌธ์ ๋ฅผ ์์ฝํ์๋ฉด ์๋์ ๊ฐ๋ค.
์ง 4๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์์ ๋, 7kg๊น์ง ๋ฃ์ ์ ์๋ ๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ์ง์ ๊ฐ์น์ ์ต๋ํฉ์ ์ผ๋ง์ธ๊ฐ?
๋ฌด๊ฒ ๊ฐ์น 6 13 4 8 3 6 5 12
์ฌ์ค ์ด ๋ฌธ์ ๋ ์ง์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ๋ก ๋๋ ์ง๋ค. (์ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ) ์ง์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ์๋ ๋์ ๊ณํ๋ฒ(Dynamic Programming)์ ์ด์ฉํด์ ํผ๋ค. ์ด ๊ธ์์๋ ๋์ ๊ณํ๋ฒ์ ์ด์ฉํด ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
์์ด๋์ด
์ด์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ์นธ์ ์ฑ์๋๊ฐ๋ฉฐ ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋๋ค.
1. [์ง์ ์+1][๋ฌด๊ฒ+1] ํฌ๊ธฐ์ ๋ฐฐ์ด์ ์์ฑํ๋ค. ์ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ง์ด 4๊ฐ์ด๊ณ ๊ฐ๋ฐฉ์ 7kg๊น์ง ๋ด์ ์ ์์ผ๋ ์๋์ ๊ฐ์ด ํ๋ฅผ ์์ฑํ๋ค.
2. ์นธ์ ์ฑ์๋๊ฐ๋ค. ์ฐ์ ์ฒซ ๋ฒ์งธ ํ์ ๊ฒฝ์ฐ๋ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ6, ๊ฐ์น 13์ ์ง์ ๋ฃ์ผ๋ ค ํ๋ ๊ฒฝ์ฐ์ด๋ค. 1~5kg๊น์ง ๋ด์ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด ์ง์ ๋ฃ์ ์ ์๊ณ , 6,7kg๊น์ง ๋ด์ ์ ์๋ค๊ณ ํ๋ ๊ฒฝ์ฐ์๋ง ์ง์ ๋ฃ์ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋ ์๋์ ๊ฐ์ด ๋๋ค.
์ต๋ 7kg๊น์ง ๋ด์ ์ ์๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ์งธ ์ง๋ ๋ฃ์ผ๋ฉด ํ๊ฐ ์๋์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ ๋ฐฐ์ด[2][6] , ๋ฐฐ์ด[2][7]๋ถ๋ถ์ด๋ค. ๊ฐ์น 6์ง๋ฆฌ ์ง์ ๋ฃ๋ ๊ฒ ๋ณด๋ค 13์ง๋ฆฌ ์ง์ ๋ฃ๋ ๊ฒ์ด ์ด๋์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์นธ์ ๊ฐ, ์ฆ ๋ฐฐ์ด[1][6], ๋ฐฐ์ด [1][7]๋ถ๋ถ์ ๊ฐ๊ฐ ๊ฐ์ ธ์ค๊ณ ์๋ค.
์ด์ 3,6์ง๋ฆฌ ์ง์ ๋ฃ๋๋ค๊ณ ํด๋ณด์. ์ฌ๊ธฐ์๋ ๋ฐฐ์ด[3][7]๋ถ๋ถ์ ์ฃผ๋ชฉํด์ผ ํ๋ค. ๋จ์ํ ์์นธ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ๊ฐ์น 8์ง๋ฆฌ ์ง(2๋ฒ ์ง)๊ณผ ๊ฐ์น 6์ธ ์ง(3๋ฒ์ง)์ ๋ฃ๋ ๊ฒ์ด ์ด๋์ด๊ธฐ ๋๋ฌธ์ ๊ฐ 14๊ฐ ๋ค์ด๊ฐ๋ค.
์ฆ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํ์์ ๊ตฌํ ์ ์๋ค. ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ๋ค.
์ง์ ๋ฃ๋ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด ๋๋ค. 3๋ฒ์งธ ์ง์ ๋ฃ์์ง ๋ง์ง ๊ฒํ ํ ๋ ๋ฌด๊ฒ 7๊น์ง ๋ฃ์ ์ ์๋ค๋ฉด, 2๋ฒ ์ง(๋ฌด๊ฒ 4, ๊ฐ์น 8)์ ์ง์ ๋ฃ๊ณ 3๋ฒ ์ง์ ๋ฃ์๋ค. ์ฆ ๋ฐฐ์ด[3][7]์ ๋ฐฐ์ด[2][7-3๋ฒ์ง์ ๋ฌด๊ฒ(3)]+3๋ฒ ์ง์ ๊ฐ์น(6) ๊ฐ์ ๋ฃ์๋ค.
์ด์ ํ๋ฅผ ๋ง์ ์ฑ์ฐ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค. ์ฐ๋ฆฌ๋ 7kg๊น์ง ๋ด์ ์ ์์ ๋์ ์ต๋ ๊ฐ์น๋ฅผ ์๊ณ ์ถ์ผ๋ ๋ฐฐ์ด[4][7]์ด ๋ต์ด๋ค. ์ฆ 14๊ฐ ๋ต์ด ๋๋ค.
์ค์ ์ฝ๋(C++)
์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define P pair<int,int>
using namespace std;
//[๋ฌผํ ์][๋ฌด๊ฒ]
int arr[101][100001];
int allweight[101];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, k, w, v;
cin >> n >> k;
//(๋ฌด๊ฒ,๊ฐ์น)์ ์์ ๋ด๋ ๋ฒกํฐ vv
vector<P> vv;
for (int i = 0; i < n; i++) {
cin >> w >> v;
vv.push_back(P(w, v));
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
int curweight = vv[i-1].first;
int curval = vv[i-1].second;
//ํ์ฌ ๊ฒํ ์ค์ธ ์ง์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ(๋ ๊ฒฝ์ฐ ์ค ์ต์ ์ ๊ฒฝ์ฐ ์ ์ ->maxํจ์ ์ฌ์ฉ)
//1. ํ์ฌ ์ง์ ๋ฃ์ง ์๋๋ค(๋ฐ๋ก ์ ์นธ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.) arr[i-1][j]
//2. ํ์ฌ ์ง์ ๋ฃ๋๋ค.arr[i-1][j-curweight]+curval
if (curweight <= j) {
arr[i][j] = max(arr[i - 1][j - curweight] + curval, arr[i - 1][j]);
}
//ํ์ฌ ๊ฒํ ์ค์ธ ์ง์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ
//๋ฐ๋ก ์ ์นธ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. arr[i-1][j]
else {
arr[i][j] = arr[i - 1][j];
}
}
}
cout << arr[n][k];
}
๊ฐ์ด ํ๋ฉด ์ข์ ๋ฌธ์ (์ถ๊ฐ ์์ )
๋ฐฐ๋ญ ๋ฌธ์ ์ ๋ํ์ ์ธ ๋ฌธ์ ์ด๋ค.
https://www.acmicpc.net/problem/12865
'Problem Solving > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 16724] ํผ๋ฆฌ๋ถ๋ ์ฌ๋์ด(C++) (0) | 2025.01.21 |
---|---|
[๋ฐฑ์ค 14889] ์คํํธ์ ๋งํฌ (C++) (0) | 2022.01.05 |
[๋ฐฑ์ค 9461] ํ๋๋ฐ ์์ด (C++) (0) | 2021.12.03 |
[๋ฐฑ์ค 1011] Fly me to the Alpha Centauri (C++) (0) | 2021.12.02 |
[๋ฐฑ์ค 1065] ํ์ (C++) (0) | 2021.12.01 |