1 λΆ„ μ†Œμš”

πŸ“ [G5_12865] ν‰λ²”ν•œ λ°°λ‚­

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main{
    static StringTokenizer st;
    static int N, K;
    public static void main(String[] args) throws IOException {
        BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));

        st = new StringTokenizer(br.readLine(), " ");

        // λ¬Όν’ˆμ˜ 수
        N = Integer.parseInt(st.nextToken());

        // 버틸 수 μžˆλŠ” 무게
        K = Integer.parseInt(st.nextToken());

        // λ¬΄κ²Œμ™€ κ°€μΉ˜ μ €μž₯ λ°°μ—΄
        int[][] arr = new int[N+1][2];

        // λ¬Όν’ˆμ˜ 무게 , 1~k κΉŒμ§€μ˜ 무게 , 값은 κ°€μΉ˜ λˆ„μ μ΄λ‹€
        int[][] dp = new int[N+1][K+1];

        for(int i=1; i<=N; i++){
            st = new StringTokenizer(br.readLine(), " ");
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        for(int i=1; i<=N; i++){
            for(int j=1; j<=K; j++){

                // λ“€μ–΄κ°ˆ 수 μžˆλŠ” 무게인 경우
                if(j - arr[i][0] >= 0){
                    // dp에 μ €μž₯된 λˆ„μ  κ°’κ³Ό ν˜„μž¬ μžμ‹ μ˜ κ°€μΉ˜μ™€ 남은 무게의 κ°€μΉ˜λ₯Ό λΉ„κ΅ν•˜μ—¬ 큰 값을 μ €μž₯ν•œλ‹€
                    dp[i][j] = Math.max(dp[i-1][j], arr[i][1] + dp[i-1][j-arr[i][0]]);
                }
                // λ“€μ–΄κ°ˆ 수 μ—†λŠ” 무게면 μ „ν–‰μ˜ 값을 κ°€μ Έμ˜¨λ‹€
                else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        System.out.println(dp[N][K]);
    }
}

πŸ€” λ‚˜μ˜ 생각

이 λ¬Έμ œλŠ” λŒ€ν‘œμ μΈ knapsack μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” λ¬Έμ œμ΄λ‹€.
λ¬Έμ œμ— λ¬΄κ²Œμ™€ κ°€μΉ˜κ°€ λ‚˜μ˜¨λ‹€λ©΄ 99% knapsack μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Όν•œλ‹€.
이 λ¬Έμ œλŠ” dp 배열에 μ•„μ΄ν…œμ˜ λ¬΄κ²Œμ™€ 1~KκΉŒμ§€μ˜ λ¬΄κ²Œμ— κ°€μΉ˜λ₯Ό μ €μž₯ν•œλ‹€.
가방에 λ“€μ–΄κ°ˆ 수 μžˆλŠ” 무게이면 dp λ°°μ—΄μ˜ λˆ„μ κ°’κ³Ό ν˜„μž¬ μžμ‹ μ˜ κ°€μΉ˜μ™€ 남은 무게의 κ°€μΉ˜λ₯Ό λΉ„κ΅ν•˜μ—¬ 큰 값을 μ €μž₯ν•œλ‹€.
이 과정을 λ°˜λ³΅ν•΄ κ°€μž₯ 졜고 κ°€μΉ˜λ₯Ό 좜λ ₯ν•΄ λ‚Έλ‹€.
μ²˜μŒμ— ν˜Ήμ‹œλ‚˜ ν•΄μ„œ λΆ€λΆ„μ§‘ν•©μ˜ ν•©μœΌλ‘œ ν’€μ–΄λ΄€λŠ”λ° λ°”λ‘œ μ‹œκ°„μ΄ˆκ³Όκ°€ 떠버렸닀.
DPλ¬Έμ œλŠ” ν™•μ‹€νžˆ μˆ˜ν•™μ μœΌλ‘œ 잘 μƒκ°ν•΄μ„œ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” 것 κ°™λ‹€. μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μ•Œκ³  μžˆλŠ” 것도 μ€‘μš”ν•˜λ‹€ !!