๋์ด๋ : ๊ณจ๋ 5
๊ฑธ๋ฆฐ ์๊ฐ : 1์๊ฐ ๋ฐ ์ด์
๋ฌธ์
์ค๋ต
์ฒ์์ ์์ ํ์์ผ๋ก ํ๋ ์ต๋ํ ์กฐํฉ์ ๋ฒ์๋ฅผ ์ค์ฌ์ ๊ตฌํํด๋ณด์๋ค.
ํ์ง๋ง, ์๊ฐ ์ด๊ณผ๋ก ์คํจ..!
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 6์ 4๋ถ ์์ => 6์ 42๋ถ ์ค๋จ, 11์ 12๋ถ ์์ =>
// N <= 10^2, K <= 10^5, W <= 10^5, V <= 10^3
// N : ๋ฌผํ ์, K : ๋ฌด๊ฒ, W : ๋ฌด๊ฒ, V : ๊ฐ์น
// 4๊ฐ 7๋ฌด๊ฒ๊น์ง ๊ฐ๋ฅ
// K๋ฌด๊ฒ๋ฅผ ๋์ง ์๋ ์ ์์ ๊ฐ์นํฉ์ ์ต๋๋ฅผ ๊ตฌํ๊ธฐ
// ์์ ํ์์ผ๋ก ํ๋ค๋ฉด ์ฃผ์ด์ง ๋ฌผ๊ฑด๋ค์ ์กฐํฉํด์ ๋ฌด๊ฒ๊ฐ K ์ดํ์ธ ์กฐํฉ๋ค ์ค ๊ฐ์น๊ฐ ๊ฐ์ฅ ๋์ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ธฐ
// ๋ฌด๊ฒ๊ฐ ๊ฐ์ ๊ฑฐ๋ ๊ฐ์น๊ฐ ๋์ ๊ฒ๋ง ๋
๋๋ฉด ๋จ
// ๋ฌด๊ฒ ์์ผ๋ก ์ ๋ ฌํด์ ๋ฌด๊ฒ๊ฐ ๊ฐ๊ฑฐ๋ ํฌ๋ฉด ๋ค์๊ฑฐ๋ ์ํด๋ ๋๊ฒ (์ถ๊ฐ)
// ๋ฌด๊ฒ๊ฐ ๋ค๋ฅธ ๊ฒ๋ง ๋จ์
// ์์ ๊ฒ๋ถํฐ ๋ํด์ K ๋์ ๋๊น์ง ๋ํด๋ณด๊ธฐ => ๊ฐฏ์์ ์ต๋ ๊ตฌํ๊ธฐ
// ํฐ ๊ฒ๋ถํฐ ๋ํด์ K ๋์ ๋๊น์ง ๋ํด๋ณด๊ธฐ => ๊ฐฏ์์ ์ต์ ๊ตฌํ๊ธฐ
// ์ต์ ๊ฐฏ์ ~ ์ต๋ ๊ฐฏ์๊น์ง ์กฐํฉ์ ํด๋ณด๊ธฐ
vector<pair<int, int>> vec;
bool compare(pair<int,int> w, pair<int, int> v) {
return w.first <= v.first;
}
int main() {
// get input
int N, K;
cin >> N >> K;
for (int i = 0; i < N; i++) {
int w, v;
cin >> w >> v;
vec.push_back(make_pair(w, v));
}
// ๋ฌด๊ฒ ์ ์ ๋ ฌ
sort(vec.begin(), vec.end(), compare);
// ๋ฌด๊ฒ๋ ๊ฐ์๋ฐ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ์์ ๊ธฐ
for (int i = 1; i < vec.size(); i++) {
if (vec[i - 1].first == vec[i].first) {
int eraseIdx = -1;
if (vec[i - 1].second < vec[i].second)
eraseIdx = i - 1;
else
eraseIdx = i;
vec.erase(vec.begin() + eraseIdx);
}
}
// ํ์ํ ๊ฐฏ์ ๋ฒ์ ๊ตฌํ๊ธฐ
int min_num, max_num;
int tmp_sum = 0; int i = 0;
// ์์ ๊ฒ๋ถํฐ ๋ํด๋ณด์์ ํ์ํ ์กฐํฉ์ ์ต๋ ๊ฐฏ์ ๊ตฌํ๊ธฐ
while (tmp_sum <= K) {
tmp_sum += vec[i++].first;
}
max_num = i;
tmp_sum = 0; i = vec.size() - 1; int j = 0;
// ํฐ ๊ฒ๋ถํฐ ๋ํด๋ณด์์ ํ์ํ ์กฐํฉ์ ์ต์ ๊ฐฏ์ ๊ตฌํ๊ธฐ
while (tmp_sum <= K) {
tmp_sum += vec[i--].first;
j++;
}
min_num = j-1;
// ๊ฐฏ์์ ๋ฒ์์์ ์กฐํฉ ๋๋ฆฌ๊ธฐ
int max = 0;
int size = vec.size();
for (int i = min_num; i <= max_num; i++) {
vector<int> combination(size, 0);
int turn = i; int idx = size - 1;
while (turn--) {
// ๋ค์์๋ถํฐ 1 ์ฑ์ฐ๊ธฐ
combination[idx--] = 1;
}
do {
int sum = 0; int value = 0;
for (int i = 0; i < size; i++) {
if (combination[i] == 1) {
sum += vec[i].first;
value += vec[i].second;
}
if (sum > K)
break;
}
if (sum > K)
continue;
max = max > value ? max : value;
} while (next_permutation(combination.begin(), combination.end()));
}
cout << max << endl;
}
ํ์ด
DP๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ฉด์, ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ๋๋ฐ ์์ธํ ํ์ด๊ฐ ์๊ฐ๋์ง ์์ ๊ทธ๋ฅ ์ง๋์ณ ๋ฒ๋ ธ๋ค.
https://yabmoons.tistory.com/571 ์์ ์ฐธ๊ณ ํ ์์ธํ ํ์ด๋ ์ด๋ ๋ค.
์ด๋ฌํ ๋ฐฐ์ด์ ํํ๋ก, ๋ฌผ๊ฑด์ ํ๋์ฉ ๋ณด๋ฉด์ ํด๋น ๋ฌผ๊ฑด์ ๋ฃ์์ง ๋ง์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค. ๋จ์ weight๊ฐ ํด๋น ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ณด๋ค ํฌ๋ฉด ๋ฃ๊ธฐ๋ก ํ์.
๋ง์ฝ ๋ฃ๋๋ค๊ณ ๊ฒฐ์ ํ๋ฉด ํ์ฌ ๋จ์ weight์์ ํด๋น ๋ฌผ๊ฑด์ weight๋ฅผ ๋บ ๊ฐ์ด ์ด ๊ฐ์ด ๋ ๊ฒ์ด๊ณ ๋ค์ ๋ฌผ๊ฑด์ผ๋ก ๋์ด๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ฃ์ง ์๋๋ค๋ฉด weight๋ ๊ทธ๋๋กํ๊ณ ๋ค์ ๋ฌผ๊ฑด์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฌด๊ฒ๊ฐ 1์ผ ๋๋ถํฐ K์ผ ๋๊น์ง๋ก ๊ฐ์ ํ ์ํฉ์์ ๋ชจ๋ ์ดํํด์ฃผ๋ฉด ๋ชจ๋ ์ํฉ์์์ ์ต๋ value๊ฐ ์ถ์ถ๋๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1149 :: RGB๊ฑฐ๋ฆฌ (0) | 2021.03.12 |
---|---|
[c++] BOJ 1520 :: ๋ด๋ฆฌ๋ง๊ธธ (0) | 2021.03.12 |
[c++] BOJ 11054 :: ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด (1) | 2021.03.06 |
[c++] BOJ 13023 :: ABCDE (ํ ์คํธ์ผ์ด์ค, ์ฝ๋) (0) | 2020.05.06 |
[c++] BOJ 1393๋ฒ :: ์ํ์ฒ ๋ ๊ตฌ๊ตฌํ (์ฝ๋, ์ฃผ์ํ ์ , ํ ์คํธ์ผ์ด์ค) (0) | 2020.05.02 |
Comment