알고리즘/백준

12865 평범한 배낭

아메숑 2019. 3. 26. 15:07

1. 문제



2. 코드

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
#include <iostream>
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int W[101];
int V[101];
int dp[101][100001];
 
int main() {
    int N, K;
    scanf("%d %d"&N, &K);
    for (int i = 1; i <= N; i++)
        scanf("%d %d"&W[i], &V[i]);
 
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= K; j++) {
            if (W[i] <= j) {
                int free_w = j - W[i];
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][free_w] + V[i]);
            }
            else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    printf("%d", dp[N][K]);
}
cs


3. 후기

dp배열은 다음과 같이 출력된다.


0 0 0 0 0 13 13

0 0 0 8 8 13 13

0 0 6 8 8 13 14

0 0 6 8 12 13 14


w[i]와 v[i]의 i를 하나씩 늘려가면서 최댓값을 찾아낸다.