SWEA level3 - 3282 0/1 knapsack
알고리즘/SW Expert Academy

SWEA level3 - 3282 0/1 knapsack

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBJAVpqrzQDFAWr&categoryId=AWBJAVpqrzQDFAWr&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 종류

동적프로그래밍

 

2. 풀이

dp의 특징을 잘 나타낸 문제다.

고려해야할 변수가 2개(부피, 가치)이기 때문에 2차원 배열을 사용해야 한다.

3. 코드

import java.util.Arrays;
import java.util.Scanner;

public class swea3282_knapsack {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		for (int tc = 1; tc <= t; tc++) {
			int n=sc.nextInt();
			int k=sc.nextInt();
			int dp[][] = new int[101][1001];
			int arr[][] = new int[n+1][2];
			for (int i = 1; i <= n; i++) {
				arr[i][0] = sc.nextInt();//부피
				arr[i][1] = sc.nextInt();//가치
			}
			Arrays.sort(arr, (o1, o2)->{
				return o1[0]-o2[0];
			});
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= k; j++) {
					if(j-arr[i][0]>=0)
						dp[i][j] = Math.max(dp[i-1][j-arr[i][0]] + arr[i][1], dp[i][j]);
					dp[i][j] = Math.max(dp[i-1][j], dp[i][j]);
				}
			}
			System.out.println("#"+tc+" "+dp[n][k]);
		}
	}
}

 

현재 물건을 선택한 경우

if(j-arr[i][0]>=0)
	dp[i][j] = Math.max(dp[i-1][j-arr[i][0]] + arr[i][1], dp[i][j]);

 

 

현재 물건을 선택 안 한 경우

dp[i][j] = Math.max(dp[i-1][j], dp[i][j]);

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[Swea - 1868] 파핑파핑 지뢰찾기  (0) 2020.11.05
[Swea - 5643] 키 순서  (0) 2020.11.04
[Swea - 1953] 탈주범 검거  (0) 2020.11.03
[swea - 10888] D4 - 음식배달  (0) 2020.10.19
SWEA level3 - 부분 수열의 합  (0) 2020.04.05