본문으로 바로가기

[백준 12865] 평범한 배낭 - JAVA // le_effort//

category 알고리즘 2020. 3. 10. 16:17

 

사용 알고리즘 : DP

 

dp배열을 2차원으로 받는다 

dp[i][j]

i = i번째 배낭

j = 무게

 

1
2
3
4
5
6
7
8
9
10
11
12
13
    for(int i=1; i<=n; i++) {
            Node a = bag[i-1];
            int w= a.w;
            int v= a.v;
            for(int j=1; j<=k; j++) {
                dp[i][j] = dp[i-1][j];
                if(j-a.w>=0) {
                    dp[i][j] = Math.max(dp[i][j], dp[i-1][j-w]+v);
                }
            }
        }
        System.out.println(dp[n][k]);
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

이 코드만 이해하면 끝이다

w = 무게

v = 가치

 

5번째 반복문은 들 수 있는 무게가 100이라고 치면

1~100까지 무게의 들 수 있는 최대 가치이다.

 

6번째 줄의 dp[i][j] = dp[i-1][j]    같은 무게 일 때  일단 지난단계의 값을 받는다 (7번째 줄이 안되면 값이 비므로 받아야함)

 

7번째줄 if(j-a.w>=0) 우선 j는 무게이다

만약 현재 배낭의 무게가 4이고 지금 아이템의 무게가 5라면

무게를 초과함으로 아이템이 들어가지 못한다.

 

하지만 들어 갈 수 있다면

dp[i-1][j-w]+v 와 비교를 하는데

 

천천히 이해해보자.

i-1을 하는 이유는 일단 지금 새로운 아이템을 넣어보는 것 이므로 아이템의 개수를 하나 뺀다.

j-w를 하는 이유는 기존의 무게에서 새로 들어갈 아이템의 가치의 최댓값 + 현재 아이템의 가치

 

이와 같이 진행 하면 된다.

 

 

 

 

 

 

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
37
38
39
40
41
42
43
import java.io.*;
import java.util.*;
public class Main {
    static int n,k;
    static int max = 1;
    static Node bag[];
    static int dp[][];
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] t = br.readLine().split(" ");
        n = Integer.parseInt(t[0]);    // 물건의수
        k = Integer.parseInt(t[1]);    // 버틸수 있는 무게
        dp = new int[n+1][k+1];
        bag = new Node[n];
        for(int i=0; i<n; i++) {
            String[] tt = br.readLine().split(" ");
            int w = Integer.parseInt(tt[0]);
            int v = Integer.parseInt(tt[1]);    
            bag[i] = new Node(w,v);
        }
        
        for(int i=1; i<=n; i++) {
            Node a = bag[i-1];
            int w= a.w;
            int v= a.v;
            for(int j=1; j<=k; j++) {
                dp[i][j] = dp[i-1][j];
                if(j-a.w>=0) {
                    dp[i][j] = Math.max(dp[i][j], dp[i-1][j-w]+v);
                }
            }
        }
        System.out.println(dp[n][k]);
    }
}
class Node{
    int w,v;
    Node(int w, int v){
        this.w=w;
        this.v=v;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
cs