[c++] BOJ 7579 :: ์•ฑ

๋ฌธ์ œ

[์•ฑ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ]

 

7579๋ฒˆ: ์•ฑ

์ž…๋ ฅ์€ 3์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ ์ค„์—๋Š” ์ •์ˆ˜ N๊ณผ M์ด ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง€๋ฉฐ, ๋‘˜์งธ ์ค„๊ณผ ์…‹์งธ ์ค„์—๋Š” ๊ฐ๊ฐ N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ๊ณต๋ฐฑ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์˜ N๊ฐœ์˜ ์ •์ˆ˜๋Š” ํ˜„์žฌ ํ™œ

www.acmicpc.net

ํ˜„์žฌ N๊ฐœ์˜ ์•ฑ, A1, ..., AN์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด๋“ค ์•ฑ Ai๋Š” ๊ฐ๊ฐ mi ๋ฐ”์ดํŠธ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ, ์•ฑ Ai๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„์— ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ, ์ถ”๊ฐ€์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋น„์šฉ(์‹œ๊ฐ„ ๋“ฑ)์„ ์ˆ˜์น˜ํ™” ํ•œ ๊ฒƒ์„ ci ๋ผ๊ณ  ํ•˜์ž. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์•ฑ B๋ฅผ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜์—ฌ, ์ถ”๊ฐ€๋กœ M ๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•˜์ž. ์ฆ‰, ํ˜„์žฌ ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋Š” ์•ฑ A1, ..., AN ์ค‘์—์„œ ๋ช‡ ๊ฐœ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜์—ฌ M ๋ฐ”์ดํŠธ ์ด์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ทธ ์ค‘์—์„œ ๋น„ํ™œ์„ฑํ™” ํ–ˆ์„ ๊ฒฝ์šฐ์˜ ๋น„์šฉ ci์˜ ํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ M ๋ฐ”์ดํŠธ๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

 

ํ’€์ด

์šฐ์„  n์ด๋ผ๋Š” ์ž…๋ ฅ ๊ฐ’์ด 100์˜ ๋ฒ”์œ„๋กœ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— brute force๋ฅผ ์ ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ์‹œ๊ฐ„์„ ์ค„์—ฌ์•ผ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ด์šฉํ•œ dp๋ฅผ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•. ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ(target)๊ฐ€ ๋‚จ์•˜์„ ๋•Œ, ํ˜„์žฌ๊นŒ์ง€ ๋ˆ ์–ดํ”Œ(visited)๋“ค์ด ๊ฐ™๋‹ค๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ ์ตœ์†Œ๋น„์šฉ์ด ๊ฐ™๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ (target, visited) => cost ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ visited(๋ช‡๋ฒˆ์งธ index ๋“ค์„ ๋“ค๋ €๋Š”์ง€)๋ฅผ ๊ฐ„๋‹จํžˆ ๋‚˜ํƒ€๋‚ด๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.

 ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•. ๋ฐฐ๋‚ญ ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์•ฑ์„ ํ›‘์–ด๋ณด๋ฉด์„œ ํ˜„์žฌ index์—์„œ ์•ฑ์„ ์ผฐ์„ ๋•Œ์˜ ์ตœ์†Œ ๋น„์šฉ๊ณผ ์•ฑ์„ ํ‚ค์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ตœ์†Œ๋น„์šฉ์„ ๋น„๊ตํ•œ๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ(target)๊ฐ€ ๋‚จ์•˜์„ ๋•Œ ํ˜„์žฌ index์—์„œ ์–ดํ”Œ์„ ์ผœ๋Š”์ง€ ์•ˆ ์ผœ๋Š”์ง€์— ๋”ฐ๋ฅธ ์ตœ์†Œ๋น„์šฉ์€ ๊ฐ™๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ (target, index) => cost๋กœ ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.

 ์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•. ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” target์ด๋ผ๋Š” 10,000,000 ๋ฒ”์œ„์˜ ์ž…๋ ฅ์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์ฐจ์›์œผ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋”ฐ๋ผ์„œ cost๋ผ๋Š” 100 ๋ฒ”์œ„์˜ ์ž…๋ ฅ์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์— ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ๊ฐ์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค. ํŠน์ • index์˜ ์•ฑ์„ ํ‚ค๊ฑฐ๋‚˜ ๋Œ ๋•Œ ํŠน์ • cost๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ํ•ด๋‹น cost์— ๋”ฐ๋ฅธ ์ตœ๋Œ€์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ (index, cost) => memory ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <string>

using namespace std;

vector<int> memoryList;
vector<int> costList;
int memo[10001]; // cost์—์„œ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ

int main() {
	int N; int M; cin >> N >> M; // 10^7
	int sum = 0;
	
	for(int i=0; i<N; i++){
		int tmp; cin >> tmp;
		memoryList.push_back(tmp);
	}
	for(int i=0; i<N; i++){
		int tmp; cin >> tmp;
		costList.push_back(tmp);
		sum+= tmp;
	}
	
	for(int i=0; i<N; i++){
		for(int j=sum; j>=costList[i]; j--){
			memo[j] = max(memo[j], memo[j-costList[i]]+memoryList[i]);
		}
	}
	
	int i=0;
	while(memo[i] < M){
		i++;
	}
	cout << i << '\n';
	
}

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•