17845번 : 수강 과목
문제)
유니스트 컴퓨터공학과에 다니는 서윤이는 이번에 어떤 과목을 들을지 고민중이다. 학점을 잘 받을 수 있으면서도 중요한 과목을 듣고 싶은 서윤이는 모든 과목의 중요도와, 일정 이상의 학점을 받기 위해 필요한 공부시간을 다 적었다.
처음에는 모든 과목을 들으려고 했던 서윤이는 자신의 공부 시간에 한계가 있다는 것을 깨달았다. 그래서, 공부 시간의 한계를 초과하지 않으면서 과목의 중요도 합이 최대가 되도록 몇 개만 선택하여 수강하기로 마음먹었다.
중요도가 최대가 되도록 과목을 선택했을 때, 최대가 되는 중요도를 출력하는 프로그램을 작성하시오.
입력 :
첫줄에 서윤이의 최대 공부시간 N (1 ≤ N ≤ 10,000), 과목 수 K (1 ≤ K ≤ 1,000)이 공백을 사이에 두고 주어진다.
이후 K개의 줄에 중요도 I (1 ≤ I ≤ 100,000), 필요한 공부시간 (1 ≤ T ≤ 10,000)이 공백을 사이에 두고 주어진다.
출력 :
얻을 수 있는 최대 중요도를 출력한다.
풀이)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// 17845. 수강 과목
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int n, k;
vector<pair<int, int>> vec;
int dp[1000][10000];
int recur(int cur, int _time)
{
if (_time > n) return INT_MIN;
if (cur == k) return 0;
if (dp[cur][_time] != -1)
{
return dp[cur][_time];
}
int ret = 0;
ret = max(recur(cur + 1, _time + vec[cur].second) + vec[cur].first
, recur(cur + 1, _time));
dp[cur][_time] = ret;
return dp[cur][_time];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
vec.resize(k, pair<int, int>());
for (auto& ele : vec) cin >> ele.first >> ele.second;
fill(&dp[0][0], &dp[999][10000], -1);
cout << recur(0, 0);
return 0;
}
|
cs |
출처 : 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
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 16938번 : 캠프 준비 (C++) (0) | 2023.10.31 |
---|---|
[백준] 4095번 : 최대 정사각형 (C++) (0) | 2023.10.26 |
[백준] 19949번 : 영재의 시험 (C++) (0) | 2023.10.25 |
[백준] 16960번 : 스위치와 램프 (C++) (0) | 2023.10.25 |
[백준] 20924번 : 트리의 기둥과 가지 (C++) (0) | 2023.10.24 |