Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

MG

[백준 / C++] 5557 - 1학년 본문

컴퓨터과학/알고리즘_PS

[백준 / C++] 5557 - 1학년

MG# 2022. 5. 17. 13:03

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

 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

다음 수를 더하고 빼는 경우의 수를 계속 세나가야 하는 DP 문제이다. dp[i][j]는 i번째 수까지 계산에 넣었을 때 그 합이 j가 되는 경우의 수이다. n번째 수를 계산에 넣기 전에 dp[n-1]를 0부터 20까지 돌려 n번째 수를 더하거나 뺐을 떄 0 이상 20 이하이면 경우의 수를 더해주면 된다.

#include <iostream>
#define MAX 101
using namespace std;

long long dp[MAX][21] = {0};
int arr[MAX];
int n;

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];

    dp[1][arr[1]]++;
    for (int i = 2; i < n; i++) {
        for (int j = 0; j <= 20; j++) {
            if (dp[i - 1][j]) {
                if (j + arr[i] <= 20)
                    dp[i][j + arr[i]] += dp[i - 1][j];
                if (j - arr[i] >= 0)
                    dp[i][j - arr[i]] += dp[i - 1][j];
            }
        }
    }

    cout << dp[n - 1][arr[n]] << "\n";
    return 0;
}

'컴퓨터과학 > 알고리즘_PS' 카테고리의 다른 글

[백준 / C++] 1238 - 파티  (0) 2022.06.01
[백준 / C++] 1149 - RGB거리  (0) 2022.05.29
[백준] 1043 - 거짓말  (0) 2022.05.16
[백준] 2293 - 동전 1  (0) 2022.05.10
[백준] 2156 - 포도주 시식  (0) 2022.05.06