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

[BOJ] 2629 : ์–‘ํŒ”์ €์šธ

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

https://www.acmicpc.net/problem/2629

 

2629๋ฒˆ: ์–‘ํŒ”์ €์šธ

์ฒซ์งธ ์ค„์—๋Š” ์ถ”์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ž์—ฐ์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ถ”์˜ ๊ฐœ์ˆ˜๋Š” 30 ์ดํ•˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ถ”์˜ ๋ฌด๊ฒŒ๋“ค์ด ์ž์—ฐ์ˆ˜๋กœ ๊ฐ€๋ฒผ์šด ๊ฒƒ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ™์€ ๋ฌด๊ฒŒ์˜ ์ถ”๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ถ”์˜ ๋ฌด

www.acmicpc.net

ํ’€์ด

๋ฐฑํŠธ๋ž˜ํ‚น์„ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ๋งŒ๋‚œ ๋ฌธ์ œ๋‹ค. ์ €์šธ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ–ˆ์„ ๋•Œ i๋ฒˆ์งธ ์ถ”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. ์™ผ์ชฝ์— ๋†“๋Š”๋‹ค

2. ์˜ค๋ฅธ์ชฝ์— ๋†“๋Š”๋‹ค

3. ๋†“์ง€ ์•Š๋Š”๋‹ค

๋งจ ์ฒ˜์Œ ๋– ์˜ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์ด๊ฒƒ์ด์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

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
#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;
const int MAX_N = 40000 + 5;
int is_ok[MAX_N];
int N, T;
vector<int> weight;
 
void backtracking(int depth, int Left, int Right) {
    if (is_ok[abs(Left - Right)])
        return;
    is_ok[abs(Left - Right)] = 1;
    if (depth == N) {
        return;
    }
    backtracking(depth + 1, Left + weight[depth], Right); //์ถ”๋ฅผ ์™ผ์ชฝ์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
    backtracking(depth + 1, Left, Right + weight[depth]); //์ถ”๋ฅผ ์˜ค๋ฅธ์ชฝ์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
    backtracking(depth + 1, Left, Right); //์ถ”๋ฅผ ์•ˆ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
}
int main(void)
 
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    int num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        weight.push_back(num);
    }
    cin >> T;
    backtracking(000);
    while (T--) {
        cin >> num;
        if (is_ok[num])
            cout << "Y";
        else cout << "N";
        cout << " ";
    }
    return 0;
}
 
 
cs

์ด๋ ‡๊ฒŒ ์„ธ ๊ฐˆ๋ž˜์˜ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ง„ํ–‰ํ•œ ๊ฒฐ๊ณผ. ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋งž์ดํ–ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ์ฝ”๋“œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š”

3์˜ N์ œ๊ณฑ. N์ด ์ตœ๋Œ€ 30์ด๋‹ˆ๊นŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ 3์˜ 30์ œ๊ณฑ. ์‹œ๊ฐ„์ œํ•œ์€ 1์ดˆ๋ฐ–์— ์•ˆ๋˜๋Š”๋ฐ 3์˜30์ œ๊ณฑ์€ 10์–ต์„

ํ›Œ์ฉ ๋›ฐ์–ด๋„˜๋Š” ์ˆซ์ž๋‹ค. ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ–ˆ๋‹ค. 3์˜ 10์ œ๊ณฑ์€ 5๋งŒ ๋‚จ์ง“ํ•˜๋‹ˆ๊นŒ 30์ด๋ฉด 10๊ฐœ์”ฉ 3๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜์ง€์•Š์„๊นŒ? ํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฑด์ง€ ์–ด๋ ค์› ๋‹ค. ๊ฒฐ๊ตญ ๊ณ ๋ฏผ๋์— ๋‹ค๋ฅธ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. 

์ฐธ๊ณ ํ•œ ์ฝ”๋“œ

https://cocoon1787.tistory.com/360

 

[C/C++] ๋ฐฑ์ค€ 2629๋ฒˆ - ์–‘ํŒ”์ €์šธ (DPํ’€์ด)

๋ฌธ์ œ ์–‘ํŒ” ์ €์šธ๊ณผ ๋ช‡ ๊ฐœ์˜ ์ถ”๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ตฌ์Šฌ์˜ ๋ฌด๊ฒŒ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ๊ฐ 1g๊ณผ 4g์ธ ๋‘ ๊ฐœ์˜ ์ถ”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ฃผ์–ด์ง„ ๊ตฌ์Šฌ๊ณผ

cocoon1787.tistory.com

์ด ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋งค์ปค๋‹ˆ์ฆ˜์€ ๋‚˜์™€ ๋น„์Šทํ•˜๋‹ค. ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด

1
if (i > n || dp[i][w]) return;
cs
 

์ด ๋ถ€๋ถ„๋งŒ ๋‹ฌ๋ž๋‹ค. ๋‚˜๋Š” is_ok๋ผ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์— ๊ทธ ๊ตฌ์Šฌ์˜ ๋ฌด๊ฒŒ๊ฐ€ ์ธก์ • ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์ € ๋ถ„์€ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด i๊ฐœ ๊นŒ์ง€ ๊ฒ€์‚ฌํ–ˆ์„๋•Œ w์˜ ๋ฌด๊ฒŒ ๊ตฌ์Šฌ์„ ์ธก์ • ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  dp[i][w]๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋ณ„๋‚ฌ์œผ๋ฉด 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
#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;
const int MAX_N = 40000 + 5;
bool is_ok[31][MAX_N];
int N, T;
vector<int> weight;
 
void backtracking(int depth, int Left, int Right) {
    if (is_ok[depth][abs(Left - Right)])
        return;
    is_ok[depth][abs(Left - Right)] = 1;
    if (depth == N)
        return;
    backtracking(depth + 1, Left + weight[depth], Right); //์ถ”๋ฅผ ์™ผ์ชฝ์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
    backtracking(depth + 1, Left, Right + weight[depth]); //์ถ”๋ฅผ ์˜ค๋ฅธ์ชฝ์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
    backtracking(depth + 1, Left, Right); //์ถ”๋ฅผ ์•ˆ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜
}
int main(void)
 
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    int num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        weight.push_back(num);
    }
    cin >> T;
    backtracking(000);
    while (T--) {
        cin >> num;
        if (is_ok[N][num])
            cout << "Y";
        else cout << "N";
        cout << " ";
    }
    return 0;
}
 
 
cs

๊ทธ๋ ‡๊ฒŒ ์ œ์ถœํ•œ ๊ฒฐ๊ณผ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ƒ…์ƒ‰์˜ ์ €์žฅ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ˜ ์ผ€์ด์Šค์˜€๋‹ค.

์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•  ๋•Œ ์‹ ์ค‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒํ•ด ์ค€ ๋ฌธ์ œ๋‹ค.

728x90

'๋ฐฑ์ค€ > Gold' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 1707 : ์ด๋ถ„ ๊ทธ๋ž˜ํ”„  (0) 2022.01.21
[BOJ] 1579 : ์•ฑ  (0) 2022.01.20
[BOJ] 10942 : ํŒฐ๋ฆฐ๋“œ๋กฌ?  (0) 2022.01.20
[BOJ] 2661: ์ข‹์€ ์ˆ˜์—ด  (0) 2022.01.19
[BOJ] 1799 : ๋น„์ˆ  (0) 2022.01.19