본문 바로가기

백준/골드

[백준 17845번] 수강 과목 (C++)

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

 

17845번: 수강 과목

첫줄에 서윤이의 최대 공부시간 N (1 ≤ N ≤ 10,000), 과목 수 K (1 ≤ K ≤ 1,000)이 공백을 사이에 두고 주어진다.  이후 K개의 줄에 중요도 I (1 ≤ I ≤ 100,000), 필요한 공부시간 (1 ≤ T ≤ 10,000)이

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, K, result;
int I[1001], T[1001], dp[1001][10001];

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> N >> K;
    
    for(int i=1; i<=K; i++)
    {
        cin >> I[i] >> T[i]; //중요도, 공부시간
    }

    for(int i=1; i<=K; i++) //과목
    {
        for(int j=1; j<=N; j++) //최대 공부시간
        {
            if(j-T[i]>=0) dp[i][j] = max(dp[i-1][j], dp[i-1][j-T[i]] + I[i]); //배낭문제
            else dp[i][j] = dp[i-1][j];
        }
    }

    cout << dp[K][N];

    return 0;
}

 

기본적인 dp 배낭 알고리즘 문제이다.

주어진 공부시간 내에 최대 중요도를 담아주고 이를 출력한다.

 

참고 링크 : https://blob-thinking.tistory.com/297

 

[백준 1106번] 호텔 (C++)

문제링크 : https://www.acmicpc.net/problem/1106 1106번: 호텔 첫째 줄에 C와 형택이가 홍보할 수 있는 도시의 개수 N이 주어진다. C는 1,000보다 작거나 같은 자연수이고, N은 20보다 작거나 같은 자연수이다.

blob-thinking.tistory.com