티스토리 뷰

문제

문제 링크: https://www.acmicpc.net/problem/11052


해당 문제의 경우는 다이나믹 프로그래밍으로 생각하는 것이 가장 중요합니다.
저 또한 문제를 보았을때, 아직까지는 정확히 어떤것을 먼저 해야되고 어떠한 식으로 접근을 해야되는지 
감이 오질 않아 많이 힘든 부분도 있습니다. 하지만 언젠가는 익숙 하겠지요? 

 <핵심>

D[i]를 붕어빵 i개를 팔아 얻을 수 있는 최대 수익P[i]는 붕어빵 i개로 이루어진 세트메뉴의 가격이라고 합시다.

 
총 i개의 붕어빵 중에서 1개를 P[1]에 판다면 남은 붕어빵의 개수는 i-1개이며 얻을 수 있는 최대 이익은 D[i-1] 입니다.
→  총 수익 : P[1] + D[i-1]

총 i개의 붕어빵 중에서 2개를 P[2]에 판다면, 남은 붕어빵의 개수는 i-2개이며 얻을 수 있는 최대 이익은 D[i-2] 입니다.
→  총 수익 : P[2]D[i-2]

이렇게 쭉 나아가다 보면, 붕어빵 i-1개를 P[i-1]에 판다면, 남은 붕어빵의 개수는 1개이며 최대 이익은 D[1]
→  총 수익 : P[i-1]D[1]

붕어빵 i개를 P[i]에 판다면, 남은 붕어빵은 없으므로 이익은 D[0]입니다.
→  총 수익 : P[i]D[0]


D[i]로 만들어질 수 있는 수익의 경우는 i개 입니다. 이들을 비교하여 제일 높은 수익을 D[i]에 저장하면 됩니다.

코드

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
/*p는 정해진 가격, d는 붕어빵을 팔았을 때 최대 수익
 붕어빵 4개 팔때 최대수익 = 붕어빵 1개 묶음 섞어서 팔때 최대수익 + 붕어빵 3개 팔때 최대수익
                    = 붕어빵 2개 묶음 섞어서 팔때 최대수익 + 붕어빵 2개 팔때 최대수익
                    = 붕어빵 3개 묶음 섞어서 팔때 최대수익 + 붕어빵 1개 팔때 최대수익
                    = 붕어빵 4개 묶음 섞어서 팔때 최대수익 + 붕어빵 0개 팔때 최대수익*/
 
#include <iostream>
 
using namespace std;
 
int p[1001],d[1001];
 
int dp(int n){
    if(n == 0) return n;
    if(d[n] > 0) return d[n];
    for(int i=1; i<=n; i++){
        d[n] = max(d[n],dp(n-i)+p[i]);
    }
    return d[n];
}
int main(){
    int n;
    cin >> n;
    for(int i=1; i<=n; i++)
        cin >> p[i];
    cout << dp(n)<<"\n";
    return 0;
}
cs


'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글

백준 14502: 연구소  (6) 2018.01.18
백준 2667: 단지번호 붙이기, 4963: 섬의 개수  (0) 2018.01.13
백준 1707: 이분 그래프  (0) 2018.01.10
백준 1463: 1로 만들기  (0) 2018.01.05
백준 10799: 쇠막대기  (0) 2017.08.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함