본문 바로가기
알고리즘/DP

7579 앱

by tryotto 2020. 2. 28.
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
32
33
34
35
36
37
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
int main() {
    int n, m;
    scanf("%d %d"&n, &m);
 
    int app[101= { 0 };
    int cost[101= { 0 };
    for (int i = 1; i <= n; i++)
        scanf("%d"&app[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d"&cost[i]);
 
    // dp[cost] = memory
    int dp[10001= { 0 };
    for (int i = 1; i <= n; i++) {
        int mem = app[i];
        int c = cost[i];
        
        for (int j = 10000; j > 0; j--)
            if (dp[j] > 0)
                dp[j + c] = max(dp[j + c], dp[j] + mem);        
        dp[c] = max(dp[c], dp[0+ mem);
    }
 
    int minCost;
    for (int i = 1; i <= 10001; i++
        if (dp[i] >= m) {
            minCost = i;
            break;
        }
    
    printf("%d", minCost);
}
cs


1. dp[cost] = 최대 memory 양
>> 이 배열을 떠올리지 못했다.
대체 어떻게 이런 생각을 해내는거지?

2. 어찌됐든, 저 발상을 가지고 시작하면 그나마 수월하다
메모장에 하나씩 써보면, 결국 그 전의 어플리케이션 기록을 기반으로 dp를 갱신해야 된다는 것을 알게 된다

3. 또한, 매 턴마다 해당 어플을 비활성화 할 수도, 안 할 수도 있다

4. 위의 매커니즘을 모두 고려해서 하려면, 결국 이중 for 문이 필요하다

5. j=1 에서부터 10000 까지 오름차순으로 갱신하려 했더니, 중복되어 계산되는 경우가 발생함을 알 수 있다.
>> 따라서, 10000부터 1까지 내림차순으로 dp 를 갱신해야겠다는 생각을 하게 된다.


'알고리즘 > DP' 카테고리의 다른 글

1351 무한 수열  (0) 2020.02.29
2240 자두나무  (0) 2020.02.28
2302 극장 좌석  (0) 2020.02.28
11066 파일합치기  (0) 2020.02.28
11052 카드 구매하기  (0) 2020.02.27