๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 1579 : ์•ฑ

by Jaeguk 2022. 1. 20.
๋ฌธ์ œ ๋งํฌ

7579๋ฒˆ: ์•ฑ (acmicpc.net)

 

7579๋ฒˆ: ์•ฑ

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

www.acmicpc.net

ํ’€์ด

์ผ๋‹จ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋‚ธ ์•„์ด๋””์–ด๋Š” Cost ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”ํ•ด๊ฐ€๋ฉด์„œ

๋ฉ”๋ชจ๋ฆฌ์˜ ํ•ฉ์ด M์„ ๋„˜์œผ๋ฉด ๊ทธ๋•Œ์˜ Cost๋ฅผ ๊ธฐ์กด๊ณผ ๋น„๊ตํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹.

๋จผ์ € ์•ฑ์— ๋Œ€ํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š”

1. ๋น„ํ™œ์„ฑํ™” ํ•œ๋‹ค

2. ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <climits>
#include <algorithm>
#include <tuple>
#include <cmath>
using namespace std;
typedef long long ll;
int N, M;
const int MAX_N = 10000000 + 5;
vector<int> Cost;
vector<int> Mem;
vector<pair<intint>> App;
int ans = INT_MAX;
 
void backtracking(int depth, int mem_sum, int cost_sum) {
    if (mem_sum >= M) {
        ans = min(cost_sum, ans);
        return;
    }
    if (depth == N)
        return;
    int now_cost = App[depth].first;
    int now_mem = App[depth].second;
    backtracking(depth + 1, mem_sum + now_mem, cost_sum + now_cost);
    backtracking(depth + 1, mem_sum, cost_sum);
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    int mem, cost;
    App.push_back({ 0,0 });
    for (int i = 0; i < N; i++) {
        cin >> mem;
        Mem.push_back(mem);
    }
    for (int i = 0; i < N; i++) {
        cin >> cost;
        Cost.push_back(cost);
    }
    for (int i = 0; i < N; i++) {
        App.push_back({ Cost[i], Mem[i] });
    }
    sort(App.begin(), App.end());
    backtracking(000);
    cout << ans << "\n";
    return 0;
}
 
 
cs

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‰ฌ์šธ๋ฆฌ๊ฐ€ ์—†๋‹ค. ์–ด๋ฆผ๋„์—†์ด ์‹œ๊ฐ„์ดˆ๊ณผ.

๋‚˜๋Š” ๋ƒ…์ƒ‰์˜ ์ €์žฅ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ ค ํ–ˆ๋‹ค dp๋ผ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด dp[depth][cost] ์— ๋น„ํ™œ์„ฑํ™” ์‹œํ‚จ memory๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๊ฐ™์€ depth์— ๊ฐ™์€ cost๋ฅผ ์ง€๋ถˆํ–ˆ๋‹ค๋ฉด ๋น„ํ™œ์„ฑํ™”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ์„ ์ˆ˜๋ก ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ if(dp[depth][cost] >= ํ˜„์žฌ๊นŒ์ง€ memory ํ•ฉ) ์ด๋ฉด return; ์„ ํ–ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <climits>
#include <algorithm>
#include <tuple>
#include <cmath>
using namespace std;
typedef long long ll;
int N, M;
const int MAX_N = 10000000 + 5;
vector<int> Cost;
vector<int> Mem;
vector<pair<intint>> App;
int ans = INT_MAX;
int dp[101][10005];
 
void backtracking(int depth, int mem_sum, int cost_sum) {
    if (mem_sum >= M) {
        ans = min(cost_sum, ans);
        return;
    }
    if (depth == N || dp[depth][cost_sum] >= mem_sum) {
        return;
    }
    int now_cost = App[depth].first;
    int now_mem = App[depth].second;
    dp[depth][cost_sum] = mem_sum;
    backtracking(depth + 1, mem_sum + now_mem, cost_sum + now_cost);
    backtracking(depth + 1, mem_sum, cost_sum);
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    int mem, cost;
    for (int i = 0; i < N; i++) {
        cin >> mem;
        Mem.push_back(mem);
    }
    for (int i = 0; i < N; i++) {
        cin >> cost;
        Cost.push_back(cost);
    }
    for (int i = 0; i < N; i++) {
        App.push_back({ Cost[i], Mem[i] });
    }
    sort(App.begin(), App.end());
    memset(dp, -1sizeof(dp));
    backtracking(000);
    cout << ans << "\n";
    return 0;
}
 
 
cs

 

728x90