๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 7์ฃผ์ฐจ] 17208๋ฒˆ ์นด์šฐ๋ฒ„๊ฑฐ ์•Œ๋ฐ”์ƒ ๊ณจ๋“œ4 - ์ž๋ฐ”(JAVA) / Knapsack/ ๋ฐฐ๋‚ญ๋ฌธ์ œ

๐Ÿ“‘ ๋ฌธ์ œ

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

๋”๋ณด๊ธฐ

๋ฌธ์ œ

์ค‘๊ฐ„๊ณ ์‚ฌ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋…ํ•ด ๊ณ„ํš ์—†์ด ๋ˆ์„ ์“ฐ๋˜ ์˜์„์ด๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„ ํ†ต์žฅ ์ž”๊ณ ๊ฐ€ 100์›๋„ ๋‚จ์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๊ณ , ๊ฒฐ๊ตญ ์˜์„์ด๋Š” ์นด์šฐ๋ฒ„๊ฑฐ ์ฃผ๋ฐฉ ์•Œ๋ฐ”๋ฅผ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์นด์šฐ๋ฒ„๊ฑฐ๋Š” ์น˜์ฆˆ๋ฒ„๊ฑฐ์™€ ๊ฐ์žํŠ€๊น€์„ ํŒŒ๋Š” ์ค‘์•™๋Œ€ํ•™๊ต์˜ ์œ ๋ช…ํ•œ ์Œ์‹์ ์ด๋‹ค.

์•Œ๋ฐ” ์ฒซ๋‚ , ์˜์„์ด๊ฐ€ ์ฃผ๋ฐฉ์— ๋“ค์–ด์„  ์ˆœ๊ฐ„ ๊ทธ๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์‚ฌ์‹ค ๊ทธ๋Š” ์น˜์ฆˆ๋ฒ„๊ฑฐ๋Š” ๋ฌผ๋ก ์ด๊ณ  ๊ฐ์žํŠ€๊น€๋„ ๋งŒ๋“ค ์ค„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๋‹คํ–‰ํžˆ๋„ ์ฃผ๋ฐฉ์—๋Š” ๋ˆ„๊ตฐ๊ฐ€ ๋งŒ๋“ค์–ด๋‘” ์น˜์ฆˆ๋ฒ„๊ฑฐ์™€ ๊ฐ์žํŠ€๊น€์ด ๋ช‡ ๊ฐœ ๋‚จ์•„์žˆ์—ˆ๊ณ , ์˜์„์ด๋Š” ํ˜„์žฌ ๋“ค์–ด์˜จ ์ฃผ๋ฌธ์„ ์ด๊ฑธ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ชจ๋“  ์ฃผ๋ฌธ์€ ๊ฐ๊ฐ ์น˜์ฆˆ๋ฒ„๊ฑฐ ์š”๊ตฌ ๊ฐœ์ˆ˜์™€ ๊ฐ์žํŠ€๊น€ ์š”๊ตฌ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” 2๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์–ด๋–ค ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์น˜์ฆˆ๋ฒ„๊ฑฐ์™€ ๊ฐ์žํŠ€๊น€์„ ์ •ํ™•ํžˆ ๊ทธ ์ฃผ๋ฌธ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋งŒํผ ์จ์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์ฃผ๋ฌธ์ด ๋“ค์–ด์˜จ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ์›ํ•˜๋Š” ์ฃผ๋ฌธ์„ ์„ ํƒํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ๋ฒˆ ์ฒ˜๋ฆฌํ•œ ์ฃผ๋ฌธ์€ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ๊ฐ™์€ ์ฃผ๋ฌธ์„ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์•„์‰ฝ๊ฒŒ๋„ ์ฃผ๋ฐฉ์— ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์ด ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ฃผ๋ฌธ์€ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฃผ๋ฌธ์„ ์„ ํƒํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ ๋ช‡ ๊ฐœ์˜ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ฃผ๋ฌธ์˜ ์ˆ˜ N(1 ≤ N ≤ 100), ์ฃผ๋ฐฉ์— ๋‚จ์€ ์น˜์ฆˆ๋ฒ„๊ฑฐ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 300), ์ฃผ๋ฐฉ์— ๋‚จ์€ ๊ฐ์žํŠ€๊น€ ๊ฐœ์ˆ˜ K(1 ≤ K ≤ 300)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ฃผ๋ฌธ ๋‚ด์šฉ์„ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ x, y (1 ≤ x, y ≤ 300)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. x๋Š” ์น˜์ฆˆ๋ฒ„๊ฑฐ ์š”๊ตฌ ๊ฐœ์ˆ˜, y๋Š” ๊ฐ์žํŠ€๊น€ ์š”๊ตฌ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

์ถœ๋ ฅ

์ฃผ๋ฐฉ์— ๋‚จ์€ ์น˜์ฆˆ๋ฒ„๊ฑฐ์™€ ๊ฐ์žํŠ€๊น€์„ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ฃผ๋ฌธ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

 ์ด ๋†ˆ์˜ DP! ๋‚˜๋Š” ํ•ญ์ƒ ์–ด๋ ค์›Œ!!!

 ์žฌ๊ท€๋กœ ํ’€๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ๊ฒฝํ—˜๋‹ด์ด๋‹ค....์ฝ”๋“œ์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ๋ผ๋Š” ๊ฒƒ์€ ์ฆ‰ DP๋ฅผ ์“ฐ๋ผ๋Š” ๋œป์ด๋‹ค.

 DP๋กœ ์ ‘๊ทผํ•˜๋ฉด, ์ „ํ˜•์ ์ธ ๋ƒ…์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

 

 

 ๐Ÿ’ก knapsack(idx, b, f): ์ฃผ๋ฌธ๋ฒˆํ˜ธ idx๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ b๊ฐœ์˜ ๋ฒ„๊ฑฐ, f๊ฐœ์˜ ํ”„๋ผ์ด๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ฃผ๋ฌธ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด.

 ๐Ÿ’ก DP[idx][b][f]: knapsack์—์„œ ๋ฆฌํ„ดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฐ์—ด

 

 

0: (10,10) 1: (10,50) 2: (20,30) 3: (20,30) 4: (15, 10)

 

 ์˜ˆ๋ฅผ ๋“ค์–ด ์ด 100๊ฐœ์˜ ๋ฒ„๊ฑฐ์™€ 100๊ฐœ์˜ ํ”„๋ผ์ด๊ฐ€ ์žˆ์„ ๋•Œ, ๋“ค์–ด์˜จ ์ฃผ๋ฌธ๋“ค์˜ (๋ฒ„๊ฑฐ, ํ”„๋ผ์ด)๊ฐ’์ด ์œ„์™€ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

 

 ์ฃผ๋ฌธ 0๋ฒˆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋‚จ์€ (๋ฒ„๊ฑฐ, ํ”„๋ผ์ด)๋Š” (90,90)์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 ์ฃผ๋ฌธ 1๋ฒˆ์€ ๋‘ ๊ฐœ์˜ ๊ธฐ๋กœ์— ๋†“์ธ๋‹ค. ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ/ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š๋ƒ.

 

 ์ฃผ๋ฌธ 1๋ฒˆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋‚จ๋Š” (๋ฒ„๊ฑฐ, ํ”„๋ผ์ด)๋Š” (80,30)์œผ๋กœ, ์ดํ›„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ๋ฌธ์˜ ๊ฐœ์ˆ˜๋Š” 2๋ฒˆ๋งŒ ์„ ํƒํ•˜๊ฑฐ๋‚˜/3๋ฒˆ๋งŒ ์„ ํƒํ•˜๊ฑฐ๋‚˜/4๋ฒˆ๋งŒ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ์ด 1๊ฐœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ knapsack(1,90,90)์€ 1๋ฒˆ ์ฃผ๋ฌธ์ฒ˜๋ฆฌ 1+์ดํ›„ ์ฃผ๋ฌธ๋“ค ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๊ฐœ์ˆ˜ 1์„ ๋”ํ•ด 2๊ฐ€ ๋œ๋‹ค.

 

 ์ฃผ๋ฌธ 1๋ฒˆ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋“ค์–ด์˜จ (๋ฒ„๊ฑฐ, ํ”„๋ผ์ด)๊ฐ’ (90,90)์„ ๊ทธ๋Œ€๋กœ ๋“ค๊ณ  ๋‹ค์Œ ์ฃผ๋ฌธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Ÿฌ ๊ฐ„๋‹ค. ์ด๋•Œ ๋„˜๊ธด (90,90)์˜ ๊ฐ’์€ ์ฃผ๋ฌธ 2,3,4๋ฒˆ์„ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์–‘์ด๋ฏ€๋กœ, ์ดํ›„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ๋ฌธ์˜ ๊ฐœ์ˆ˜๋Š” 3์ด ๋ฆฌํ„ด๋œ๋‹ค. ๋”ฐ๋ผ์„œ knapsack(1,90,90)์€ 1๋ฒˆ ์ฃผ๋ฌธ์ฒ˜๋ฆฌ 0+์ดํ›„ ์ฃผ๋ฌธ๋“ค ์ตœ๋Œ€ ์ฒ˜๋ฆฌ ๊ฐœ์ˆ˜ 3์„ ๋”ํ•˜์—ฌ ์ด 3์ด ๋œ๋‹ค.

 

 ์ฃผ๋ฌธ 1๋ฒˆ์€ ์ด ๋‘ ๊ฐ€์ง€ ์ƒํƒœ ์ค‘ ๊ฐ€์žฅ ์ตœ๋Œ€๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์„ ์ฐพ์•„ dp[1][90][90]์— ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 3์ด ๋  ๊ฒƒ์ด๋‹ค.

 

 ์ด ๋ฆฌํ„ด๊ฐ’์€ ๊ณ ์Šค๋ž€ํžˆ ์ฃผ๋ฌธ 0๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

 ์•ž์„œ ์œ„ ์˜ˆ์‹œ๋Š” ์ฃผ๋ฌธ 0๋ฒˆ์„ "์ฒ˜๋ฆฌํ–ˆ์„ ๋•Œ"๋ฅผ ๊ฐ€์ •์œผ๋กœ ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค. ์ฃผ๋ฌธ 0๋ฒˆ์€ ํ•ด๋‹น ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์™€, (0๋ฒˆ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๊ฐœ์ˆ˜ 1+์ดํ›„ ์ฃผ๋ฌธ๋“ค ์ตœ๋Œ€ ์ฒ˜๋ฆฌ ๊ฐœ์ˆ˜ 3)์ธ ๊ฐ’ 4๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ทธ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

public class Main_๋ฐฑ์ค€_17208_์นด์šฐ๋ฒ„๊ฑฐ์•Œ๋ฐ”์ƒ_๊ณจ๋“œIV {
	static int N, M, K, result=Integer.MIN_VALUE;
	static int[][] order;
	static int[][][] dp;
	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());	//order
		M = Integer.parseInt(st.nextToken());	//burgers
		K = Integer.parseInt(st.nextToken());	//fries
		order = new int[N][2];
		dp = new int[N][301][301];
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			order[i][0] = Integer.parseInt(st.nextToken()); //burger
			order[i][1] = Integer.parseInt(st.nextToken()); //fri
		}//input
		
		// ํŠน์ • order๊ฐ€ ๋‚จ์€ ๊ฐ์žํŠ€๊น€์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๋•Œ: ์ฃผ๋ฌธ์„ ๋ฐ›๊ฑฐ๋‚˜/ ์•ˆ๋ฐ›๊ฑฐ๋‚˜
//		takeOrder(0, 0, 0, 0); ์‹œ๊ฐ„์ดˆ๊ณผ
		System.out.println(knapsack(0, M, K));;
	}//end of main
	
	static private void takeOrder(int bSum, int fSum, int idx, int cnt) {
		if(idx==N) {
			result = Math.max(cnt, result);
			return;
		}
		int burger = order[idx][0];
		int fri = order[idx][1];
		if(bSum+burger<=M && fSum+fri<=K) {
			takeOrder(bSum+burger, fSum+fri, idx+1, cnt+1);
		}
		takeOrder(bSum, fSum, idx+1, cnt);
	}//end of takeOrder
	
	static private int knapsack(int idx, int b, int f) {
		
		if(idx==N) return 0;
		
		int burger = order[idx][0];
		int fri = order[idx][1];
		if(dp[idx][b][f] != 0) return dp[idx][b][f];
		
		int orderCnt = knapsack(idx+1, b, f);
		if(burger<=b && fri<=f) {
			orderCnt = Math.max(knapsack(idx+1, b-burger, f-fri)+1, orderCnt);
		}
		return dp[idx][b][f] = orderCnt;
	}//end of knapsack
}//end of class

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ