본문 바로가기
Algorithm/Study

Knapsack

by 당진개발자 2024. 3. 26.

1. 0-1 Knapsack 유형

  - 배낭에 물건을 통째로 담아야 하는 문제

  - 물건을 쪼갤 수 없는 경우

  - 참고 : https://howudong.tistory.com/106

 

배낭 문제(KnapSack Problem) 그림으로 쉽게 이해하기

배낭 알고리즘이란? 배낭 문제(Knapsack)는 n개의 물건과 배낭 있을 때, 각 물건에는 가치와 무게가 존재한다. 또한 각 물건은 1개씩만 있다. 배낭에는 담을 수 있는 최대 용량이 존재한다. 이러한

howudong.tistory.com

 


 

2. Fractional Knapsack

  - 물건을 부분적으로 담는 것이 허용되는 문제

  - 물건을 쪼갤 수 있는 경우

 


 

3. 배낭 문제 해결 (물건, 물건의 무게, 물건의 가치, 배낭의 용량)

  - 점화식

   

 

  - 코드 예제

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

public class Main {
	static int N;	// 물건의 갯수
	static int K;	// 버틸 수 있는 무게
	static int[][] dp;	// i번째 물건까지 j (kg)을 버틸 수 있는 최대 가치
	static int[] W;	// 물건의 무게
	static int[] V; // 물건의 가치
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		W = new int[N + 1];
		V = new int[N + 1];
		dp = new int[N + 1][K + 1];
		
		for (int i = 1; i < N + 1; i++) {
			st = new StringTokenizer(br.readLine());
			W[i] = Integer.parseInt(st.nextToken());
			V[i] = Integer.parseInt(st.nextToken());
		}
		
		for (int i = 1; i < N + 1; i++) {	// i번째 물건까지 고려
			for (int j = 1; j < K + 1; j++) {	// j(kg)까지 버틸 수 있는지
				if (W[i] > j) {
					dp[i][j] = dp[i - 1][j];
				} else {
					dp[i][j] = Math.max(dp[i - 1][j], V[i] + dp[i - 1][j - W[i]]);
				}
			}
		}
		
		System.out.println(dp[N][K]);
	}
}

'Algorithm > Study' 카테고리의 다른 글

플로이드 워셜  (0) 2024.03.29
최장 증가 부분 수열 (LIS)  (0) 2024.03.27
그래프  (0) 2024.02.15
그리디 알고리즘(탐욕법)  (0) 2024.02.13
완전탐색 응용, Next Permutation  (0) 2024.02.08