문제링크 : https://www.acmicpc.net/problem/7579
#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 |