티스토리 뷰

#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]);
}

14501번 예제 입력 4

 

 

풀이 : dynamic programing

상담하는 시간을 고려하며, 걸리는 시간과, 얻는 돈을 입력 받은 다음에, 상담하는 시간 + 걸리는 시간에 걸리는 얻는 돈을 dp[]에 저장한다. dp[]에 저장 할 때는 더 큰 것을 저장한다.

또한 날짜를 증가시키면서, 그 날짜까지 벌 수있는 돈 (dp[])의 최댓값을 구해놓는다. 이를 위해선, 그 전날 의 dp[]와 비교하여, 전 것이 더 크면, 전 것을 대입, 아니면, 그대로 둔 다. (이걸 안하면, 최댓값을 구할 수 가 없다) (일을 안 하는 날이 있을 수도 있다)

 

 

 

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함