백준 7579 앱 [c++]

c++

문제 분석

  • 문제 길어….
  • 여러 개의 앱이 활성화 되어 있는데, 이 중 일부 앱을 꺼서, 일정량 이상의 메모리를 확보하려고 한다.
  • 각각의 앱은 정해진 크기의 메모리를 차지하고 있으며,
  • 프로그램을 끌 때도 프로그램별로 일정 비용이 필요하다.
  • 최소 비용으로 일정량 이상의 메모리를 확보하게 해 봐라.

입력조건

켜져 있는 프로그램 수 N 확보해야 할 메모리 양 M
N개의 프로그램이 차지하는 메모리 양 [숫자]
N개의 프로그램을 끌 때 필요한 비용 [숫자]

풀이과정

  • 가방 문제…
  • 백트래킹으로 풀었다가 시간초과를 봐버렸다.
  • dp로 배낭문제처럼 dp판을 완성한 뒤,
  • dp의 맨 밑줄에서 M보다 크거나 같아지는 최초의 값을 출력.

전체 코드

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int N, M;
    int *memories;
    int *shutcost;

    cin >> N >> M;

    memories = new int[N+1];
    shutcost = new int[N+1];
    int costsum = 0;

    for(int i = 1; i <= N; i++) cin >> memories[i];
    for(int i = 1; i <= N; i++) {
        cin >> shutcost[i];
        costsum += shutcost[i];
    }

    int dp[N+1][costsum + 1];
    
    for(int i = 0; i <= costsum; i++) dp[0][i] = 0;

    for(int i = 1; i <= N; i++ ) {
        for(int j = 0; j <= costsum; j++) {
            dp[i][j] = 0;

            if( j - shutcost[i] >= 0 ) 
                dp[i][j] = dp[i-1][j-shutcost[i]] + memories[i];

            dp[i][j] = max(dp[i][j], dp[i-1][j]);
        }
    }

    // for(int i = 0; i <= N; i++) {
    //     for(int j = 0; j <= costsum; j++){
    //         printf("%4d", dp[i][j]);
    //     }
    //     cout << endl;
    // }

    for(int i = 0; i <= costsum; i++) {
        if(dp[N][i] >= M) {
            cout << i << endl;
            return 0;
        } 
    }
}