[c++] BOJ 12865 :: ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

๋‚œ์ด๋„ : ๊ณจ๋“œ 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๊ฐ€ ์ถ”์ถœ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•