[BOJ] 1106_호텔

ProblemSolving / / 2021. 1. 28. 19:32

호텔

문제 링크: https://www.acmicpc.net/problem/1106

 

1106번: 호텔

첫째 줄에 C와 형택이가 홍보할 수 있는 도시의 개수 N이 주어진다. C는 1,000보다 작거나 같은 자연수이고, N은 20보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각 도시에서 홍보할 때

www.acmicpc.net

 

i를 i개의 손님 유치 수라 하자.
dp[i]는 손님 유치를 하는데 드는 최소비용이라고 정의할 수 있다.

 

 

현재 상태의 손님 유치의 수를 c라 하면, 다음의 단계에서 들었던 비용과 현재의 비용의 합이 c를 유치하는데 드는 비용이 된다.
그 중 가장 최소인 값이 dp[i]의 값이 될 것이다.

 

Dynamic Programming의 방법 중 Top-Down 방식을 채택하여 다음과 같이 코드를 구성했다.

 

  • 정답코드

      #include<iostream>
      using namespace std;
    
      #define min(a, b) (a<b ? a : b)
      #define maxInt 10000000
    
      int dp[2000] = { 0, };
      int info[21][2];
    
      int DP(int c, int n) {
          if (c < 0)
              return 0;
          else if (c == 0)
              return cost;
          else if (dp[c] > 0) 
              return dp[c];
          else{
              int m = maxInt;
              for (int i = 0; i < n; i++)
                  m = min(m, DP((c - info[i][1]), n) + info[i][0]);
              dp[c] = m;
              return dp[c];
          }
    
      }
    
      int main() {
          ios_base::sync_with_stdio(false);
          cin.tie(NULL); cout.tie(NULL);
    
          int c = 0, n = 0;
          scanf_s("%d%d", &c, &n);
          memset(dp, -1, sizeof(dp));
    
          for (int i = 0; i < n; i++)
              scanf_s("%d%d", &info[i][0], &info[i][1]);
    
          printf("%d", DP(c, n));
          return 0;
      }

 

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1564_팩토리얼5  (0) 2021.01.31
[BOJ] 1927_최소 힙  (0) 2021.01.29
[BOJ] 1149_RGB거리  (0) 2021.01.27
[BOJ] 19948_음유시인 영재  (0) 2021.01.26
[BOJ] 1931_회의실 배정  (0) 2021.01.25
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기