문제링크 : https://www.acmicpc.net/problem/16493
16493번: 최대 페이지 수
첫째 줄에 N(1 ≤ N ≤ 200)과 챕터의 수 M(1 ≤ M ≤ 20)이 주어진다. 둘째 줄부터 각 챕터 당 읽는데 소요되는 일 수와 페이지 수가 주어진다. 소요되는 일 수는 20보다 작거나 같은 자연수이고, 페이
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int day[21], page[21];
int dp[21][201];
int result = 0;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N, M;
cin >> N >> M;
for(int i=1; i<=M; i++)
{
cin >> day[i] >> page[i];
}
for(int i=1; i<=M; i++)
{
for(int j=0; j<=N; j++)
{
if(j-day[i]>=0) dp[i][j] = max(dp[i-1][j], dp[i-1][j-day[i]]+page[i]);
else dp[i][j] = dp[i-1][j];
}
}
cout << dp[M][N];
return 0;
}
백준 1535번인 안녕 문제와 거의 동일한 DP 배낭 문제이다.
알고리즘 자체는 동일하나, 처음에 dp[M][N]이 아닌 dp[N][M]으로 작성하고 시간을 다소 낭비했던 문제이다.
주어진 요일 내에 최대한의 페이지를 읽는 것이 목적이므로 현재 주어진 일 수에 비교하여 최대 일 수인 N까지 읽을 수 있는 최대 페이지 수를 더해주면 된다.
dp[i][j] = i 챕터까지 j일 동안 읽을 수 있는 최대 페이지의 수
'백준 > 실버' 카테고리의 다른 글
[백준 15988번] 1, 2, 3 더하기 3 (C++) (0) | 2023.10.06 |
---|---|
[백준 15624번] 피보나치 수 7 (C++) (0) | 2023.10.05 |
[백준 1535번] 안녕 (C++) (0) | 2023.10.01 |
[백준 16967번] 배열 복원하기 (C++) (0) | 2023.09.30 |
[백준 1935번] 후위 표기식2 (C++) (0) | 2023.09.24 |