[ ๋ฌธ์ ๋งํฌ ]
https://www.acmicpc.net/problem/12865
๐ฉ ์กฐ๊ฑด
- ์ฒซ ์ค์ ๋ฌผํ์ ์ N(1 ≤ N ≤ 100)๊ณผ ์ค์๊ฐ ๋ฒํธ ์ ์๋ ๋ฌด๊ฒ K(1 ≤ K ≤ 100,000)๊ฐ ์ฃผ์ด์ง
- ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ W(1 ≤ W ≤ 100,000)์ ํด๋น ๋ฌผ๊ฑด์ ๊ฐ์น V(0 ≤ V ≤ 1,000)๊ฐ ์ฃผ์ด์ง
- ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ๋ฌผ๊ฑด๋ค์ ๊ฐ์นํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํด๋ผ
๐ฉ ์ ๊ทผ
0/1 Knapsack ๋ฌธ์ .. ์ด๋ป๊ฒ ํธ๋ ๊ฑฐ์๋๋ผ...
๐ฉ ์ํ์ฐฉ์ค
์ฒ์์ Branch and Bound๋ก ์๋ํด๋ณด๋ ค ํ๋ค๊ฐ ๊ทธ๋ํ๋ฅผ ์ด๋ป๊ฒ ์ ์ํด์ผ ํ ์ง ๊ฐ์ด ์์์.. ํฌ๊ธฐ
์๊ณ ๋ฆฌ์ฆ ์๊ฐ์ ๋ฐฐ์ด ๊ธฐ์ต์ผ๋ก๋ DP๋ก ํธ๋ ๊ฒ ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๊ฐ Brute Force์ ๊ฐ์์ง๋ค๊ณ ํ๋๋ฐ.. => ์ด๊ฑด N์ด ์์ฒญ๋๊ฒ ์ปค์ก์ ๋! ๊ทธ๋์ Backtracking๊ณผ Branch & Bound ๋ผ๋ ์๋ก์ด ์ ๊ทผ๋ฒ์ด ๋๋๋จ
์ด์จ๋ ์ด ๋ฌธ์ ๋ DP๋ก ํ๋ฉด ๋๋ค!
๐ป ์ฝ๋ (C++)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int D[101][100001]; // 1-indexed
vector<int> wv; // 0-indexed
vector<int> vv; // 0-indexed
int main(){
int n, k, w, v;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>w>>v;
wv.push_back(w);
vv.push_back(v);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
if(j-wv[i-1] < 0)
D[i][j]=D[i-1][j];
else
D[i][j]=max(D[i-1][j], D[i-1][j-wv[i-1]]+vv[i-1]);
}
}
cout<<D[n][k];
}
'๐ป Algorithms > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1676 ํฉํ ๋ฆฌ์ผ 0์ ๊ฐ์ - ์ํ, ์ ์๋ก (1) | 2024.09.16 |
---|---|
[๋ฐฑ์ค] 1929 ์์ ๊ตฌํ๊ธฐ - ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (0) | 2024.09.15 |
[๋ฐฑ์ค] 10844 ์ฌ์ด ๊ณ๋จ ์ - ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2024.09.01 |
[๋ฐฑ์ค] 11727 2xn ํ์ผ๋ง2 - ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2024.08.31 |
[๋ฐฑ์ค] 1932 ์ ์ ์ผ๊ฐํ - ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2024.08.31 |