๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•
ํ•ด๋‹น ๊ธ€์˜ ๋‚ด์šฉ์€ ์ตœ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๊ธ€์“ด์ด์˜ ์ฃผ๊ด€์ ์ธ ํ’€์ด์ž…๋‹ˆ๋‹ค. ๋” ์ข‹์€ ํ’€์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค(__)

 

๋งํฌ


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

 

 

๋ฌธ์ œ ์„ค๋ช…


 ์ด ๋ฌธ์ œ๋Š” ์•„์ฃผ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

 ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.

 

 ์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

 ์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋ฌด๊ฒŒ๊นŒ์ง€์˜ ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค.

์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.

 

 

 

์ œํ•œ ์กฐ๊ฑด


[์ž…๋ ฅ]

 ์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 ≤ K ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 ≤ W ≤ 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 ≤ V ≤ 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋‹ค.

 

[์ถœ๋ ฅ]

ํ•œ ์ค„์— ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

์ž…์ถœ๋ ฅ ์˜ˆ


<์ž…๋ ฅ 1>

4 7
6 13
4 8
3 6
5 12

 

 

<์ถœ๋ ฅ 1>

14

 

 

 

ํ’€์ด


[Golang]

package main

import (
	"bufio"
	"fmt"
	"os"
)

var (
	N, K int
	ObjectInfoSlice []Object
	ResultSlice [][]int
)

type Object struct {
	Weight,Value int
}

func max(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

func main() {
	r := bufio.NewReader(os.Stdin)
	_, _ = fmt.Fscanf(r, "%d %d\n", &N, &K)

	ResultSlice = make([][]int, K+1)
	for i := 0; i <= K; i++ {
		ResultSlice[i] = make([]int, N+1)
	}

	ObjectInfoSlice = make([]Object, N+1)
	for i := 1; i <= N; i++ {
		var weight, value int
		_, _ = fmt.Fscanf(r, "%d %d\n", &weight, &value)
		ObjectInfoSlice[i] = Object{
			Weight: weight,
			Value:  value,
		}
	}

	for bagWeight := 1; bagWeight <= K; bagWeight++ {
		for objectIndex := 1; objectIndex <= N; objectIndex++ {
			object :=  ObjectInfoSlice[objectIndex]
			if bagWeight >= object.Weight {
				ResultSlice[bagWeight][objectIndex] =  max(ResultSlice[bagWeight][objectIndex-1], ResultSlice[bagWeight-object.Weight][objectIndex-1] + ObjectInfoSlice[objectIndex].Value)
			} else {
				ResultSlice[bagWeight][objectIndex] = ResultSlice[bagWeight][objectIndex-1]
			}
		}
	}

	fmt.Print(ResultSlice[K][N])
}

 

 

[C++]

#include <iostream>

struct Object 
{
	int weight;
	int value;
};

int max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

int main()
{
	std::cin.tie(NULL);
	std::ios::sync_with_stdio(false);

	int n, k;
	std::cin >> n >> k;
	int** arr = new int*[k + 1];
	for (int i = 0; i <= k; i++)
	{
		arr[i] = new int[n+1];
		std::fill_n(arr[i], n + 1, 0);
	}
	Object* objectArr = new Object[n + 1];

	for (int i = 1; i <= n; i++)
	{
		std::cin >> objectArr[i].weight >> objectArr[i].value;
	}

	for (int bagWeight = 1; bagWeight <= k; bagWeight++)
	{
		for (int objectIndex = 1; objectIndex <= n; objectIndex++)
		{
			Object obj = objectArr[objectIndex];
			if (bagWeight >= obj.weight)
			{
				arr[bagWeight][objectIndex] = max(arr[bagWeight][objectIndex-1], arr[bagWeight - obj.weight][objectIndex-1] + obj.value);
			}
			else
			{
				arr[bagWeight][objectIndex] = arr[bagWeight][objectIndex-1];
			}
		}
	}

	std::cout << arr[k][n];
	return 0;
}

 

 

 

ํ’€์ด ์„ค๋ช…


 ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ํ•จ์ˆ˜ํ˜•ํƒœ๋กœ ํ’€๋ฉด(DFS,...) ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์‹คํŒจํ•œ๋‹ค.

n ๊ฐœ์˜ ์š”์†Œ์—์„œ x๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋งŒํผ์„ ๋ชจ๋‘ ์—ฐ์‚ฐ์„ ํ•˜๋‹ค ๋ณด๋‹ˆ

 

nC0 + nC1 + ... + nC r = 2^n

 

๋ผ๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ณ  ์‹œ๊ฐ„์ดˆ๊ณผ ๋  ์ˆ˜๋ฐ–์— ์—†๋‹ค.

 

๋”ฐ๋ผ์„œ ๋™์  ๊ณ„ํš๋ฒ•(๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ, DP)์œผ๋กœ ํ’€์ดํ•œ๋‹ค.

์‚ฌ์‹ค, ์ด ๋ฌธ์ œ๋Š” knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ๋ฌธ์ œ์ด๋‹ค.

 

https://cjwoov.tistory.com/57

 

[Dynamic Programming] ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Knapsack Problem)

์„ค๋ช…  ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Knapsack Problem)๋Š” ์กฐํ•ฉ ์ตœ์ ํ™”์˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ๋‹ค.  ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด์ž. ํ•œ ์—ฌํ–‰๊ฐ€๊ฐ€ ์—ฌํ–‰์„ ๋– ๋‚˜๋ ค๊ณ  ํ•œ๋‹ค. ์—ฌํ–‰๊ฐ€๊ฐ€ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” ๋ฐฐ๋‚ญ์—๋Š” ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด

cjwoov.tistory.com

 

๋ฐ˜์‘ํ˜•