ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]12865. 평범한 배낭 - Java
    알고리즘/백준 2021. 2. 17. 23:50

    📄 링크

    평범한 배낭


    💡 문제 분석

    최대 K 무게를 담을 수 있는 배낭에 물품들을 담을 때, 가치를 가장 크게 할 수 있는 방법을 구하는 문제입니다.
    일단 물품 수 100개 중에 몇 개인지 모를 물품을 골라 무게를 비교하는 완전탐색은 당연히 시간 초과가 날 것 같아서 메모이제이션를 사용하기로 했습니다

    1. 일단 물품들을 배열에 저장합니다.
    2. cache[idx][weight] = 배열의 idx 인덱스 이후의 물품들을 사용해서 weight 무게 내로 가질 수 있는 최대 가치입니다.
    3. idx를 하나씩 늘려가며 현재 물품을 가방에 넣을 때와, 넣지 않을 때 중 가치가 높은 것을 cache 배열에 저장합니다
    4. 0번 인덱스부터 K의 무게로 시작하는 메모이제이션 함수를 출력합니다

    ⌨️ 코드

    public class _12865_평범한배낭 {
        static class Product {
            int v, w;
    
            public Product(int w, int v) {
                this.v = v;
                this.w = w;
            }
        }
        static int N, K;
        static Product[] Products;
        static int[][] cache;
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            N = sc.nextInt();
            K = sc.nextInt();
            Products = new Product[N];
            cache = new int[N][K + 1];
            for(int i = 0; i < N; i++)
                Arrays.fill(cache[i], -1);
            for(int i = 0; i < N; i++)
            Products[i] = new Product(sc.nextInt(), sc.nextInt());
            System.out.println(solve(0, K));
        }
    
        public static int solve(int idx, int weight) {
            if(idx == N) return 0;
            int ret = cache\[idx\][weight];
            if(ret != -1) return ret;
            ret = solve(idx + 1, weight);
            if(weight >= Products[idx].w)
                ret = Math.max(ret, solve(idx + 1, weight - Products[idx].w) + Products[idx].v);
            return cache\[idx\][weight] = ret;
        }
    }

    📋 결과

    '알고리즘 > 백준' 카테고리의 다른 글

    [백준]9663. N-Queen - Java  (0) 2021.02.17
    [백준]2206. 벽 부수고 이동하기 - Java  (0) 2021.02.17
    [백준]16639. 괄호 추가하기 3  (0) 2021.01.10
    [백준]18500. 미네랄2  (0) 2021.01.10
    [백준]1918. 후위 표기식  (1) 2021.01.08

    댓글

Designed by Tistory.