[ 백준 ] 1535 / 안녕

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
207/228
post-thumbnail

# Appreciation

/*
 * Problem :: 1535 / 안녕
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - 각 사람들에게 인사는 한 번만 한다
 *   인사를 할 때마다 체력이 닳고 기쁨을 얻는다
 *   얻을 수 있는 최대 기쁨은 몇 일까?
 *   + 각 보석들을 종류별로 하나씩만 훔친다
 *     훔칠때마다 가방이 무거워지고 돈을 얻는다
 *     얻을 수 있는 최대 돈은 얼마일까?
 *     # 전형적인 0-1 Knapsack 문제이다
 *
 * - dp[i][j] = 체력 j 에서 1~i 번째 각각의 사람들에게
 *              인사를 하거나 하지 않았을 경우 얻을 수 있는 최대 기쁨
 *   + dp[i][j] 는 i 번째 사람에게 인사를 할 수 있을 때와 그렇지 않을 때를 비교해서 구한다
 *     # dp[i][j] = dp[i-1][j] <= i 번째 사람에게 인사를 할 수 없을 때
 *     # if (j-L[i] > 0) { <= i 번째 사람에게 인사를 할 수 있을 때
 *           dp[i][j] = max(dp[i][j], dp[i-1][j-L[i]]+J[i])
 *       }
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <cstring>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int L[N+1], J[N+1];
    for (int i=1; i<=N; i++)
        cin >> L[i];
    for (int i=1; i<=N; i++)
        cin >> J[i];

    // Process
    /* dp[i][j] = 체력 j 에서 1~i 번째의 각 사람들에게
     *            인사를 하거나 하지 않았을 경우 얻을 수 있는 최대 기쁨 */
    int dp[N+1][100+1];
    memset(dp, 0, sizeof(dp));

    for (int i=1; i<=N; i++) {
        for (int j=1; j<=100; j++) {
            dp[i][j] = dp[i-1][j]; /* i 번째 사람에게 인사를 할 수 없다면 */
            if (j-L[i] > 0) { /* i 번째 사람에게 인사를 할 수 있다면 */
                dp[i][j] = max(dp[i][j], dp[i-1][j-L[i]]+J[i]);
            }
        }
    }

    // Control : Output
    cout << dp[N][100] << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글