03
25

 

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

โ–ถ ์œ ํ˜•

  • S๋Š” ์ „์ฒด ๋ฌผ๊ฑด๋“ค์˜ ์ง‘ํ•ฉ
  • ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , ๊ฐ€์น˜๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๋•Œ
  • ์„ค์ •๋œ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ๋„˜์ง€ ์•Š์œผ๋ฉด์„œ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด ๋ถ€๋ถ„ ์ง‘ํ•ฉ S์„ ๊ตฌํ•˜๋Š” ๊ฒƒ
  • ๋ฌผ๊ฑด์„ ์ผ๋ถ€๋ถ„๋งŒ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ ๋ฐฐ๋‚ญ์„ ์ฑ„์šฐ๋Š”์ง€, ๋ฌด์กฐ๊ฑด ํ•ด๋‹น ๋ฌผ๊ฑด ํ†ต์œผ๋กœ ์ฑ™๊ฒจ์•ผ ํ•˜๋Š” ์ง€์— ๋”ฐ๋ผ์„œ
    0-1 ๋ฐฐ๋‚ญ, ๋ถ€๋ถ„ ๋ฐฐ๋‚ญ ๋ฌธ์ œ๋กœ ์œ ํ˜•์ด ๊ฐˆ๋ฆฐ๋‹ค.

๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ชจ๋‘ ์ƒ์„ฑํ•ด์„œ(bruteforce) ํ’€ ์ˆ˜ ๋„ ์žˆ์ง€๋งŒ ์ „์ฒด ๋ฌผ๊ฑด ์ˆ˜ n์ด ์ปค์ง€๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํ„ฐ์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค.

=> O(2^n) // ๋ถ€๋ถ„ ์ง‘ํ•ฉ ์ƒ์„ฑ์—๋งŒ

n์ด 30๋งŒ ๋˜๋”๋ผ๋„ ์•ฝ 10์–ต์ด๋ผ์„œ(leaf๋…ธ๋“œ ์ƒ์„ฑ๋งŒ) ์žฌ๊ท€ ์Šคํƒ์ด ๋ชป๋ฒ„ํ…จ ํ„ฐ์ ธ๋ฒ„๋ฆด ๊ฒƒ์ด๋‹ค. ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ์ณ์„œ ์ตœ๋Œ€ํ•œ ๋ฒ„ํ‹ฐ๋”๋ผ๋„ ๋” ํฐ n๋งŒ๋‚˜๋ฉด ๋‹ต์ด ์—†๋‹ค.

โ–ถ ์ „๋žต

0-1 ๋ฐฐ๋‚ญ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ

์„ ํƒ ๊ธฐ์ค€์ด ๋ฌด๊ฒŒ, ๊ฐ€์น˜ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„๋ฉด, ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค.

  • ๋ฌด๊ฒŒ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€๋ฒผ์šด ๊ฑฐ ๋ถ€ํ„ฐ ๋‹ด์„ ๊ฒฝ์šฐ -> ๋ฌด๊ฑฐ์šด ๊ฒƒ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์••๋„์  ๊ฐ€์น˜๋ฅผ ์ง€๋‹ˆ๋ฉด ๋ฐ˜๋ก€๊ฐ€ ๋œ๋‹ค.
  • ๊ฐ€์น˜ ๊ธฐ์ค€์œผ๋กœ ๋†’์€ ๊ฑฐ ๋ถ€ํ„ฐ ๋‹ด์„ ๊ฒฝ์šฐ -> ๊ฐ€์น˜ ๋†’์€ ๊ฑฐ ํ•˜๋‚˜๋ฅผ ๋‹ด์•˜์„ ๋•Œ๋ณด๋‹ค, ๊ฐ€์น˜ ๋‚ฎ์€๊ฑฐ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋‹ด์•˜์„ ๋•Œ๊ฐ€ ๋” ํ•ฉ์‚ฐ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌด๊ฒŒ ๋‹น ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๊ฑฐ๋กœ ์ •๋ ฌํ•ด์„œ ๋‹ด์„ ๊ฒฝ์šฐ ->  ์ด ๊ฒฝ์šฐ๋„ ๋ฌด๊ฑฐ์šด ๊ฒƒ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์••๋„์  ๊ฐ€์น˜๋ฅผ ์ง€๋…€๋ฒ„๋ฆฌ๋ฉด ๋ฐ˜๋ก€๋‹ค.

๊ฒฐ๊ตญ ๋™์ ๊ณ„ํš๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

DP์˜ ํ•ต์‹ฌ์€ ์ด์ „ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‹ค์Œ ๊ฒฝ์šฐ์˜ ์ˆ˜์— ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ bottom-upํ˜•์‹์œผ๋กœ,  ์–ด๋–ค ์ตœ์ ํ•ด๋Š” ๊ทธ ์ด์ „ ๋‹จ๊ณ„์˜ ์ตœ์ ํ•ด๋ฅผ ํ•ญ์ƒ ํฌํ•จํ•œ๋‹ค๋Š” ์›๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด 0-1 ๋ฐฐ๋‚ญ์„ ๋‹ค์‹œ ์ชผ๊ฐœ๋ณด๋ฉด

- i๋ฒˆ์งธ ๋ฌผ๊ฑด์ด ๋ฐฐ๋‚ญ์˜ ํ•œ๊ณ„ ๋ฌด๊ฒŒ๋ณด๋‹ค ๋ฌด๊ฑฐ์šฐ๋ฉด ->
i๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ์ œ์™ธํ•˜๊ณ  i-1๊ฐœ์˜ ๋ฌผ๊ฑด๋“ค์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ•œ ์ „ ๋‹จ๊ณ„์˜ ์ตœ์ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

- else ->
[i๋ฒˆ์งธ ๋ฌผ๊ฑด๋งŒํผ์˜ ๋ฌด๊ฒŒ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์˜ ์ตœ์ ๊ฐ’์— i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋ฅผ ๋”ํ•œ ๊ฐ’]๊ณผ
[i-1๊ฐœ์˜ ๋ฌผ๊ฑด๋“ค์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ•œ ์ „ ๋‹จ๊ณ„์˜ ์ตœ์ ๊ฐ’] ์ค‘ ํฐ ๊ฒƒ์„ ์„ ํƒํ•œ๋‹ค -> ๋‹ค์ต์ŠคํŠธ๋ผ๋ž‘ ์กฐ๊ธˆ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™๋‹ค

๊ทธ๋Ÿผ ์‚ดํŽด์•ผ๋  ๊ธฐ์ค€์ด 2๊ฐœ๋‹ˆ๊นŒ 2์ฐจ์› dp๋กœ ์ ‘๊ทผํ•œ๋‹ค. 

 

์ฆ‰

  1. ๋งŒ์•ฝ ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฌผ๊ฑด์€ ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด์ „ ์ƒํƒœ(dp[i-1][w])๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ .
  2. ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด์ „ ๋ฌผ๊ฑด์„ ๋‹ด์•˜์„ ๋•Œ์˜ ๊ฐ€์น˜(dp[i-1][w])์™€ ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์•˜์„ ๋•Œ์˜ ๊ฐ€์น˜
    (dp[i-1][w - input[i][0]] + input[i][1])๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int n = Integer.parseInt(st.nextToken()); // ๋ฌผํ’ˆ์˜ ์ˆ˜
		int k = Integer.parseInt(st.nextToken()); // ์ตœ๋Œ€ ๋ฌด๊ฒŒ

		int[][] dp = new int[n + 1][k + 1]; // ์šฉ๋Ÿ‰์ด k์ธ ๋ฐฐ๋‚ญ์ด๊ณ , ๊ฐ row์˜ ์ธ๋ฑ์Šค์—๋Š” ํ•ด๋‹น ์šฉ๋Ÿ‰์ผ ๋•Œ์˜ ๊ฐ€์น˜๊ฐ’์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค.
		int[][] input = new int[n + 1][2]; // ๊ฐ ๋ฌผ๊ฑด์˜ 0-๋ฌด๊ฒŒ, 1-๊ฐ€์น˜
		for (int i = 1; i <= n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			// i๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ, ๊ฐ€์น˜
			int weight = Integer.parseInt(st.nextToken());
			int value = Integer.parseInt(st.nextToken());
			input[i][0] = weight;
			input[i][1] = value;
		}

		// ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ
		for (int i = 1; i <= n; i++) {
			// N๊ฐœ์˜ ๋ฐฐ๋‚ญ
			for (int w = 1; w <= k; w++) { // ์ตœ๋Œ€ k ๋ฌด๊ฒŒ๋ฅผ ๋‹ด์„ ๋•Œ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค
				if (input[i][0] > w) { // ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋‹ค
					// ์ด ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ์ด์ „ ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ƒํƒœ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค(๋ฌผ๊ฑด ์•ˆ ๋‹ด์„ ๊ฑฐ๋‹ˆ๊นŒ)
					dp[i][w] = dp[i - 1][w]; // ๋ฌด๊ฒŒ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ€์น˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค
				}
				else { // ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋‹ค 
					// ์ด์ „ ๋ฌผ๊ฑด์„ ๋‹ด์€ ์ƒํƒœ๊ฐ€ ์ง€๊ธˆ ๋ฌผ๊ฑด์„ ๋‹ด์„ ๊ฒฝ์šฐ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋” ํฌ๋ฉด, ๋ฌผ๊ฑด์„ ์•ˆ๋‹ด๊ณ  ๋„˜์–ด๊ฐ„๋‹ค 
					dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - input[i][0]] + input[i][1]);
				}
			}
		}
		System.out.println(dp[n][k]);
	}
}

 

dp[i][w - input[i][0]] ๋Š” ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์„ ๊ฒฝ์šฐ, ๋‚จ์€ ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ฆ‰, ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด๋Š”๋‹ค๊ณ  ์ „์ œ๋ฅผ ํ•˜๊ณ , ํ˜„์žฌ ๋ฌด๊ฒŒ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ด์ „ ๋ฌด๊ฒŒ index์˜ ๊ฐ€์น˜๊ฐ’์ด๋ž‘ ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๊ฐ’์„ ๋”ํ•œ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ max๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ w - input[i][0]๋Š” ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋ฅผ ๋ฐฐ๋‚ญ์˜ ์ด ๋ฌด๊ฒŒ ํ•œ๋„์—์„œ ๋บ€ ๊ฐ’์œผ๋กœ, ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์„ ๋•Œ์˜ ๋‚จ์€ ์—ฌ์œ  ๊ณต๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ถ€๋ถ„ ๋ฐฐ๋‚ญ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ

๋ฌด๊ฒŒ ๋‹น ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๊ฑฐ๋กœ ์ •๋ ฌํ•ด์„œ ๋‹ด์„ ๊ฒฝ์šฐ๊ฐ€ ์ตœ์ ํ•ด๊ฐ€ ๋œ๋‹ค. <- greedy๊ฐ€ ํ†ตํ•œ๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^
๋ฐ˜์‘ํ˜•
COMMENT