문제링크 : https://www.acmicpc.net/problem/1535
1535번: 안녕
첫째 줄에 사람의 수 N(≤ 20)이 들어온다. 둘째 줄에는 각각의 사람에게 인사를 할 때, 잃는 체력이 1번 사람부터 순서대로 들어오고, 셋째 줄에는 각각의 사람에게 인사를 할 때, 얻는 기쁨이 1번
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int L[21], J[21];
int dp[21][101];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for(int i=1; i<=N; i++) cin >> L[i]; //체력
for(int i=1; i<=N; i++) cin >> J[i]; //기쁨
for(int i=1; i<=N; i++)
{
for(int j=0; j<=100; j++)
{
if(j-L[i]>0) dp[i][j] = max(dp[i-1][j], dp[i-1][j-L[i]]+J[i]);
else dp[i][j] = dp[i-1][j];
}
}
cout << dp[N][100];
return 0;
}
DP 배낭 문제이다.
가능한 체력 내에서 최대한의 기쁨을 더해주면 된다.
주의해야할 것은 체력이 0이나 음수가 되면 기쁨이 0이 되는 것이다.
따라서 j-L[i]>=0이 아닌 j-L[i]>0으로 체력이 0이하가 되지 않도록 해주었다.
주어진 인원수 N에 체력 최대치 100이내에 최대한의 기쁨을 찾는 것이므로 dp[N][100]을 출력해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 15624번] 피보나치 수 7 (C++) (0) | 2023.10.05 |
---|---|
[백준 16493번] 최대 페이지 수 (C++) (0) | 2023.10.02 |
[백준 16967번] 배열 복원하기 (C++) (0) | 2023.09.30 |
[백준 1935번] 후위 표기식2 (C++) (0) | 2023.09.24 |
[백준 12847번] 꿀 아르바이트 (C++) (0) | 2023.09.22 |