์ฝ”๋”ฉํ…Œ์ŠคํŠธ/์•Œ๊ณ ๋ฆฌ์ฆ˜

[C++ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏนํ”„๋กœ๊ทธ๋ž˜๋ฐ2 - ๋ฐฐ๋‚ญ๋ฌธ์ œ(Knapsack Problem)

kite707 2022. 1. 4.

๋ฐฐ๋‚ญ๋ฌธ์ œ(Knapsack Problem)

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋ฌธ์ œ์ด๋‹ค. ํ•œ ์—ฌํ–‰๊ฐ€๊ฐ€ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” ๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๊ณ , ์ผ์ • ๊ฐ€์น˜์™€ ๋ฌด๊ฒŒ๊ฐ€ ์žˆ๋Š” ์ง๋“ค์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ๋•Œ, ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ์ง์„ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

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

๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

์ง 4๊ฐœ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žˆ์„ ๋•Œ, 7kg๊นŒ์ง€ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฐฉ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ง์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ€ํ•ฉ์€ ์–ผ๋งˆ์ธ๊ฐ€?
๋ฌด๊ฒŒ ๊ฐ€์น˜
6 13
4 8
3 6
5 12

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋Š” ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค. (์œ„ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ) ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming)์„ ์ด์šฉํ•ด์„œ ํ‘ผ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋™์ ๊ณ„ํš๋ฒ•์„ ์ด์šฉํ•ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์•„์ด๋””์–ด

์ด์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์นธ์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ ๋œ๋‹ค.

 

1. [์ง์˜ ์ˆ˜+1][๋ฌด๊ฒŒ+1] ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค. ์œ„ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ง์ด 4๊ฐœ์ด๊ณ  ๊ฐ€๋ฐฉ์— 7kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

 

2. ์นธ์„ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค. ์šฐ์„  ์ฒซ ๋ฒˆ์งธ ํ–‰์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ€๋ฐฉ์— ๋ฌด๊ฒŒ6, ๊ฐ€์น˜ 13์˜ ์ง์„ ๋„ฃ์œผ๋ ค ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. 1~5kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด ์ง์€ ๋„ฃ์„ ์ˆ˜ ์—†๊ณ , 6,7kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค. 

 

์ตœ๋Œ€ 7kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ ์ง๋„ ๋„ฃ์œผ๋ฉด ํ‘œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ์ ์€ ๋ฐฐ์—ด[2][6] , ๋ฐฐ์—ด[2][7]๋ถ€๋ถ„์ด๋‹ค. ๊ฐ€์น˜ 6์งœ๋ฆฌ ์ง์„ ๋„ฃ๋Š” ๊ฒƒ ๋ณด๋‹ค 13์งœ๋ฆฌ ์ง์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ด๋“์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์œ—์นธ์˜ ๊ฐ’, ์ฆ‰ ๋ฐฐ์—ด[1][6], ๋ฐฐ์—ด [1][7]๋ถ€๋ถ„์„ ๊ฐ๊ฐ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค.

์ด์ œ 3,6์งœ๋ฆฌ ์ง์„ ๋„ฃ๋Š”๋‹ค๊ณ  ํ•ด๋ณด์ž. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฐ์—ด[3][7]๋ถ€๋ถ„์— ์ฃผ๋ชฉํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ˆœํžˆ ์œ—์นธ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ€์น˜ 8์งœ๋ฆฌ ์ง(2๋ฒˆ ์ง)๊ณผ ๊ฐ€์น˜ 6์ธ ์ง(3๋ฒˆ์ง)์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ด๋“์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’ 14๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. 

 

์ฆ‰ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ ํ™”์‹์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ง์„ ๋„ฃ๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐ”๋กœ ์œ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋ฉด ๋œ๋‹ค. 3๋ฒˆ์งธ ์ง์„ ๋„ฃ์„์ง€ ๋ง์ง€ ๊ฒ€ํ† ํ•  ๋•Œ ๋ฌด๊ฒŒ 7๊นŒ์ง€ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด, 2๋ฒˆ ์ง(๋ฌด๊ฒŒ 4, ๊ฐ€์น˜ 8)์˜ ์ง์„ ๋„ฃ๊ณ  3๋ฒˆ ์ง์„ ๋„ฃ์—ˆ๋‹ค. ์ฆ‰ ๋ฐฐ์—ด[3][7]์— ๋ฐฐ์—ด[2][7-3๋ฒˆ์ง์˜ ๋ฌด๊ฒŒ(3)]+3๋ฒˆ ์ง์˜ ๊ฐ€์น˜(6) ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค.

 

์ด์ œ ํ‘œ๋ฅผ ๋งˆ์ € ์ฑ„์šฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” 7kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ์„ ๋•Œ์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ์•Œ๊ณ ์‹ถ์œผ๋‹ˆ ๋ฐฐ์—ด[4][7]์ด ๋‹ต์ด๋‹ค. ์ฆ‰ 14๊ฐ€ ๋‹ต์ด ๋œ๋‹ค.

 

์‹ค์ œ ์ฝ”๋“œ(C++)

์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define P pair<int,int>
using namespace std;
//[๋ฌผํ’ˆ ์ˆ˜][๋ฌด๊ฒŒ]
int arr[101][100001];
int allweight[101];

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

	int n, k, w, v;
	cin >> n >> k;
	//(๋ฌด๊ฒŒ,๊ฐ€์น˜)์˜ ์Œ์„ ๋‹ด๋Š” ๋ฒกํ„ฐ vv
	vector<P> vv;
	for (int i = 0; i < n; i++) {
		cin >> w >> v;
		vv.push_back(P(w, v));
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= k; j++) {
			int curweight = vv[i-1].first;
			int curval = vv[i-1].second;
			//ํ˜„์žฌ ๊ฒ€ํ† ์ค‘์ธ ์ง์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(๋‘ ๊ฒฝ์šฐ ์ค‘ ์ตœ์ ์˜ ๊ฒฝ์šฐ ์„ ์ •->maxํ•จ์ˆ˜ ์‚ฌ์šฉ)
			//1. ํ˜„์žฌ ์ง์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค(๋ฐ”๋กœ ์œ— ์นธ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.) arr[i-1][j]
			//2. ํ˜„์žฌ ์ง์„ ๋„ฃ๋Š”๋‹ค.arr[i-1][j-curweight]+curval
			if (curweight <= j) {
				arr[i][j] = max(arr[i - 1][j - curweight] + curval, arr[i - 1][j]);
			}
			//ํ˜„์žฌ ๊ฒ€ํ† ์ค‘์ธ ์ง์„ ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
			//๋ฐ”๋กœ ์œ— ์นธ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. arr[i-1][j]
			else {
				arr[i][j] = arr[i - 1][j];
			}
		}
	}
	cout << arr[n][k];

}

 

๊ฐ™์ด ํ’€๋ฉด ์ข‹์€ ๋ฌธ์ œ(์ถ”๊ฐ€ ์˜ˆ์ •)

๋ฐฐ๋‚ญ ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ด๋‹ค.

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

 

๋Œ“๊ธ€