본문 바로가기

백준/골드

[백준 7579번] 앱 (C++)

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

 

7579번: 앱

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int arr[101], cost[101];
int dp[101][10001];
int sum = 0, result = MAX;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    int N, M;
    cin >> N >> M;
    for(int i=1; i<=N; i++)
    {
        cin >> arr[i];
    }
    for(int i=1; i<=N; i++)
    {
        cin >> cost[i];
        sum+=cost[i];
    }

    for(int i=1; i<=N; i++) //~i번째 앱
    {
        for(int j=0; j<=sum; j++) //비용
        {
            if(j-cost[i] >= 0) dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]] + arr[i]); 
            else dp[i][j] = dp[i-1][j];
            if(dp[i][j]>=M) result = min(result, j); //최소 비용 저장
        }
    }
    cout << result;

    return 0;
}

배낭문제의 응용 버전이다.

기존 배낭 문제는 i를 물건의 번호, j를 현재 배낭의 무게로 두고 점화식은 다음과 같다. 

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + V[i]);
w[i] = 해당 물건의 무게
v[i] = 해당 물건의 가치
dp[i][j] = 가능한 최대 가치

 

해당 문제에서는 i를 앱의 번호, j를 비용으로 두고 풀면된다.

따라서 dp[i][j]에는 비용에 따른 메모리의 최대치를 담게 되고, w[i]에는 비용을, v[i]에는 메모리의 양으로 대체된다.

우리는 최대 메모리의 양을 구하는 것이 목표가 아니라, 메로리의 양이 M만 넘으면 된다.

따라서 dp[i][j]이 M이상일 때 최소비용인 j를 따로 저장해서 출력해주면 된다. 

'백준 > 골드' 카테고리의 다른 글

[백준 2629번] 양팔저울 (C++)  (0) 2023.09.29
[백준 4781번] 사탕 가게 (C++)  (0) 2023.09.28
[백준 2056번] 작업 (C++)  (0) 2023.09.26
[백준 2252번] 줄 세우기 (C++)  (0) 2023.09.25
[백준 2143번] 두 배열의 합 (C++)  (0) 2023.09.23