PS

BOJ 7579 - 앱

728x90

www.acmicpc.net/problem/7579

 

7579번: 앱

입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활

www.acmicpc.net

 

냅색 응용 문제이다.

dp 1차원 배열을 dp[j] : 비용이 j일때 확보가능한 메모리로 정의하고 

점화식을 dp[j] = max(dp[j], dp[j - cost[i]] + memory[i]) 로 정의할 수 있다.

-> 비용이 j 일때 확보가능한 메모리는, i 번째 앱을 활성화하지 않았을때의 메모리와 i번째 앱을 활성화 했을때의 메모리 값 중 최대치로 정의한다.

여기서 정의한 dp 배열은 메모리에 대한 부분만 담겨 있기 때문에, 문제에서 요구하는 최소비용과 직접적으로 연결된것은 아니므로 최소비용을 구하기 위한 별도의 로직을 작성해야한다.

이를 위해 반복문을 하나 만들어서 최소 M 메모리 이상 확보할 수 있게하는 최소한의 비용값을 구해준다.

 

 

- C++

#include <iostream>
 
using namespace std;
 
int N, M; // 활성화된 앱 갯수, 확보해야할 메모리 
pair<intint> app[101]; // 점유 중인 메모리 바이트 m, 비활성 비용 c 
int dp[10001]; // 비용이 i 일때, 확보 가능한 메모리 
int sum; 
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> N >> M; 
    for (int i = 1; i <= N; ++i) cin >> app[i].first;
    for (int i = 1; i <= N; ++i) {
        cin >> app[i].second;
        sum += app[i].second;    
    }
    
    for (int i = 1; i <= N; ++i) 
        for (int j = sum; j >= app[i].second; --j) 
            dp[j] = max(dp[j], dp[j - app[i].second] + app[i].first);
            
    int answer = 0;
    while(1) {
        if (answer < sum && dp[answer] < M) answer++;
        else break;
    }
    cout << answer;
    
    return 0;
}
cs

728x90

'PS' 카테고리의 다른 글

BOJ 3114 - 사과와 바나나  (0) 2021.03.12
BOJ 19538 - 루머  (0) 2021.03.11
BOJ 1943 - 동전 분배  (0) 2021.03.09
BOJ 1199 - 오일러 회로  (0) 2021.03.05
BOJ 2513 - 통학버스  (0) 2021.03.04