c언어/BAEKJOON
c언어 14501번 퇴사 (백준)
rofn123
2023. 1. 13. 06:18
#include <stdio.h>
int dp[16] = {};
int main(void) {
int n=0;
scanf("%d", &n);
for(int i=0; i<=n; i++) { //가장 돈을 많이 버는 경우를 구하기
if(i>0) if(dp[i] < dp[i-1]) dp[i]=dp[i-1]; //바로 전 보다, 돈을 더 적게 번다면, 전 껄로 바꾼다.
if(n==i) break;
int t, p; //걸린 시간, 얻는 돈
scanf("%d %d", &t, &p); //입력
if(t+i > n) continue; //퇴직날을 초과 하면, 상담이 불가하므로, 스킵한다.
if(dp[i+t] < dp[i]+p) dp[i+t] = dp[i]+p; //걸린 시간 + 상담 한 시간 에서 얻는 돈이 지금 경우가 더 클 경우 바꾸어 준다.
}
printf("%d", dp[n]);
}
풀이 : dynamic programing
상담하는 시간을 고려하며, 걸리는 시간과, 얻는 돈을 입력 받은 다음에, 상담하는 시간 + 걸리는 시간에 걸리는 얻는 돈을 dp[]에 저장한다. dp[]에 저장 할 때는 더 큰 것을 저장한다.
또한 날짜를 증가시키면서, 그 날짜까지 벌 수있는 돈 (dp[])의 최댓값을 구해놓는다. 이를 위해선, 그 전날 의 dp[]와 비교하여, 전 것이 더 크면, 전 것을 대입, 아니면, 그대로 둔 다. (이걸 안하면, 최댓값을 구할 수 가 없다) (일을 안 하는 날이 있을 수도 있다)
https://www.acmicpc.net/problem/14501
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net