(백준) 평범한 베낭 - 12865

2021. 7. 19. 14:44·알고리즘/백준

https://www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

🐢문제설명

베낭에 최대한의 이익을 내면서 담는 것이 목표인 문제인데, 이러한 유형을 냅색 문제라고 한다. 냅색 문제는 대부분 dp로 풀면 되는경우가 많다. 이번 문제 또한 대표적인 냅색 문제이므로 dp로 풀어보자.

 

🐢풀이법

먼저 베낭에 담을 수 있는 최대 무게만큼 배열을 선언해 준다. 그러면 배열의 각 인덱스는 베낭에 담긴 무게가 되고, 해당 인덱스가 갖는 값은 그 때 가질 수 있는 최대 가치가 될 수 있다.

 

따라서, 가방의 최대 크기부터 현재 물건을 자신의 가방에 넣을 수 있는 무게의 하한선 까지 모든 무게에 대해서 확인을 해줘야 한다.

-> 현재 가방의 무게에서 가지는 가치 vs (현재 가방의 무게 - 물건의 무게)에서 가지는 가치 + 물건의 가치

 위 비교를 통해서 가방이 각 무게마다 가질 수 있는 최대 가치를 갱신 해주면 된다.

 

🐢코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        int N = Integer.parseInt(st.nextToken()); // N개의 물건
        int W = Integer.parseInt(st.nextToken()); // 가방의 최대 허용 무게
 
        int[] dp = new int[W + 1]; // 모든 무게에서 가치를 측정하기 위한 배열
 
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int w = Integer.parseInt(st.nextToken());
            int p = Integer.parseInt(st.nextToken());
 
            for (int weight = W; weight >= w ; weight--) { // 가방의 남는 공간을 최대부터 최소로 돌면서 비교
                dp[weight] = Math.max(dp[weight], dp[weight - w] + p); // 넣지 않는 경우 vs 넣는 경우
                // 참고로 역순으로 돌아야 중복을 막을 수 있다
            }
        }
        System.out.println(dp[W]);
    }
}
 
Colored by Color Scripter
cs
반응형
저작자표시 (새창열림)

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

(백준) 음악프로그램 - 2623  (0) 2021.07.23
(백준) 보스몬스터 전리품 - 20005  (0) 2021.07.22
(백준) 가운데서 만나기 - 21940  (0) 2021.07.22
(백준) 다리만들기 - 2146  (2) 2021.07.16
(백준) 모자이크 - 2539  (1) 2021.07.16
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 보스몬스터 전리품 - 20005
  • (백준) 가운데서 만나기 - 21940
  • (백준) 다리만들기 - 2146
  • (백준) 모자이크 - 2539
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    마우스 패드
    류블라냐
    레이저
    크로아티아
    동유럽
    mx master s3 for mac
    마우스
    키보드 손목 받침대
    부다페스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 평범한 베낭 - 12865
상단으로

티스토리툴바