BOJ

7579 앱

공부정리 2017. 10. 3. 03:34

N개의 앱이 작동중일 때 M만큼의 메모리를 확보하려 할 때 앱 비활성화 비용의 최소값을 구하는 문제다.


dp를 d[N][M]로 잡으면 10억이므로 메모리 초과가 난다. 그렇기 때문에 d[N][s] 로 생각 한다.


앱 비활성화 비용의 합이 s일 때 확보할 수 있는 최대 메모리값을 저장하는 것이다.


<코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <algorithm>
using namespace std;
 
int a[101], b[101], n, m, d[10001], sum, i, j;
 
int main() {
    scanf("%d%d"&n, &m);
    for (i = 0; i < n; i++scanf("%d"&a[i]);
    for (i = 0; i < n; i++scanf("%d"&b[i]), sum += b[i];
    for (i = 0; i < n; i++for (j = sum; j >= b[i]; j--) {
        d[j] = max(d[j], d[j - b[i]] + a[i]);
    }
    for (i = 0; i < sum && d[i] < m; i++);
    printf("%d\n", i);
    return 0;
}
cs