무게와 가치가 주워지는 n개 중 가장 최적의 무게로 최대의 가치를 뽑아내는 알고리즘은
Knapsack 알고리즘(https://naivep.tistory.com/72)이라고 따로 단어가 있다고 한다.
D[i][j]를 첫번째부터 i번째까지 물건을 탐색했고, 탐색해서 담은 물건들의 무게 합을 j라고 할때 가중치의 합이다.
여기서 i번째 물건을 담은 경우와 담지 않은 경우가 있는데
담은 경우는 D[i-1][j-w[i]] + v[i]이다. ( w[i]는 i의 무게, v[i]는 i의 가치)
담지 않은 경우는 D[i-1][j]
여기서 모든 j의 경우에 대해 max값을 찾으면 된다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<stdio.h> #include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std ; int d[101][100001]; int w[101]; int v[101]; int main() { //freopen("Text.txt", "r", stdin); int n, k; cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> w[i] >> v[i]; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= k; j++) { d[i][j] = d[i - 1][j]; if (j - w[i] >= 0) { d[i][j] = max(d[i][j], d[i - 1][j - w[i]] + v[i]); } } } cout << d[n][k] << endl; } | cs |
'BOJ' 카테고리의 다른 글
백준 5557 / 1학년 (0) | 2019.02.14 |
---|---|
백준 1495 / 기타리스트 (0) | 2019.02.13 |
백준 11066 / 파일 합치기 (0) | 2019.02.13 |
백준 11058 / 크리보드 (0) | 2019.02.10 |
백준 2293 / 동전 1 (0) | 2019.02.10 |