๋ฌธ์
ํ์ฌ 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';
}
๊ฒฐ๊ณผ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1013 :: Contact (0) | 2021.10.17 |
---|---|
[c++] BOJ 20040 :: ์ฌ์ดํด ๊ฒ์ (0) | 2021.10.10 |
[c++] BOJ 1501 :: ์์ด ์ฝ๊ธฐ (0) | 2021.10.07 |
[c++] BOJ 1253 :: ์ข๋ค (0) | 2021.09.28 |
[c++] BOJ 4195 :: ์น๊ตฌ ๋คํธ์ํฌ (0) | 2021.09.28 |
Comment