본문 바로가기
백준/DP

백준 12865. 평범한 배낭

by 29살아저씨 2021. 9. 26.
반응형

🅰 백준 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

✏️ 문제 풀이

  • 먼저 버틸수 있는 무게 K만큼 반복하면서 현재의 물건이 가방에 넣을 수 있는지 확인해서 dp를 수행한다.
  • product배열에 물품들의 무게, 가치를 저장해주고 dp배열은 N+1,kg+1로 생성해준다
  • 2중 for문을 사용하면서 바깥 for문에는 물품의 수만큼 반복하고, 안쪽 for문에는 넣을수 있는 무게만큼(kg) 반복해준다
  • 예제 입력 데이터 

     4 7

     6 13

     4 8

     3 6

     5 12 을 넣으면 오른쪽과 같은 테이블이 생성된다

 

 

✏️ 소스코드

package dp;

import java.util.*;
import java.io.*;

public class Main_골드5_12865_평범한배낭X {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int kg = Integer.parseInt(st.nextToken());

		int dp[][] = new int[N+1][kg+1];
		int product[][] = new int[N+1][2];
        
        // 데이터 입력
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine());
			product[i][0] = Integer.parseInt(st.nextToken());
			product[i][1] = Integer.parseInt(st.nextToken());
		}

		// dp수행
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= kg; j++) {
				if (j - product[i][0] >= 0) {
				  dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-product[i][0]] + product[i][1]);
				}
				else {
					dp[i][j] = dp[i-1][j];
				}
			}
		}
		System.out.println(dp[N][kg]);
	}
}

 

✅ 후기

  • 가장 기본적인 dp문제인 knapsack문제이다. 더 다양한 dp문제를 풀면서 접근하는 방법에 대해 익숙해져야겠다
반응형

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

백준 1495. 기타리스트  (0) 2021.09.27
백준 12920. 평범한 배낭 2  (0) 2021.09.27
백준 2294. 동전 2  (0) 2021.09.26
백준 11066 파일합치기  (0) 2021.09.26
백준 1890. 점프  (0) 2021.09.23

댓글