BOJ
백준 12865 / 평범한 배낭
로봇이아닙니다
2019. 2. 13. 19:29
무게와 가치가 주워지는 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 |