본문 바로가기
알고리즘 문제풀이/백준

[백준 1495] 기타리스트

by m2162003 2020. 12. 13.

www.acmicpc.net/problem/1495

 

1495번: 기타리스트

첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.

www.acmicpc.net

DP를 사용하는 문제이다. DP[I][J]를 가능한 최댓값으로 접근하면 문제를 풀 수 없다. 경우의 수가 많기 때문

따라서 DP[I][J]는 I번째 노래에서 J의 볼륨이 가능한지 여부여야 한다. 

DP[0][S] = 1로 초기화 된다. 

그 다음에 입력을 받으면서 이전 노래에서 J 볼륨이 가능했다면 J +- IDX가 가능한지 확인하여 DP 배열에 체크한다.

마지막 노래에 볼륨 조절이 불가하면 -1을 리턴하라고 했으므로 DP[N][J]의 값이 모두 0이면 -1을 리턴한다.

#include <stdio.h>

using namespace std;

int dp[101][1001];
int n, s, m;
int main(void)
{
  scanf("%d %d %d", &n, &s, &m);
  dp[0][s] = 1;
  for (int i = 1; i <= n; i++)
  {
    int idx;
    scanf("%d", &idx);
    for (int j = 0; j <= m; j++)
    {
      if (dp[i - 1][j] == 0)
      {
        continue;
      }

      if (j - idx >= 0)
      {
        dp[i][j - idx] = 1;
      }

      if (j + idx <= m)
      {
        dp[i][j + idx] = 1;
      }
    }
  }

  for (int i = m; i > -1; i--)
  {
    if (dp[n][i] == 1)
    {
      printf("%d\n", i);
      return 0;
    }
  }

  printf("-1\n");
  return 0;
}

 

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2011] 암호코드  (0) 2020.12.15
[백준 1629] 곱셈  (1) 2020.12.13
[백준 1074] Z  (0) 2020.12.13
[백준 1992] 쿼드트리  (0) 2020.12.13
[백준 5904] Moo 게임  (0) 2020.12.12

댓글