득이공간

[백준 C++] 7579 앱 - 다이나믹프로그래밍 본문

PS/알고리즘 문제풀이

[백준 C++] 7579 앱 - 다이나믹프로그래밍

쟁득 2024. 3. 19. 11:52
 

7579번: 앱

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

www.acmicpc.net

#include <iostream>
using namespace std;

int Memory[101];
int Cost[101];
int DP[101][10001];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	int N, M;
	cin >> N >> M;
	for (int i = 1; i <= N; ++i)
	{
		cin >> Memory[i];
	}
	for (int i = 1; i <= N; ++i)
	{
		cin >> Cost[i];
	}

	for (int i = 1; i <= N; ++i)
	{
		int Mem = Memory[i];
		int Cst = Cost[i];
		for (int c = 0; c <= 10000; ++c)
		{
			if (c >= Cst)
			{
				DP[i][c] = max(DP[i - 1][c], DP[i - 1][c - Cst] + Mem);
			}
			else
			{
				DP[i][c] = DP[i - 1][c];
			}
		}
	}

	for (int c = 0; c <= 10000; ++c)
	{
		if (DP[N][c] >= M)
		{
			cout << c;
			return 0;
		}
	}
}

 

DP & 배낭 문제입니다.

 

DP[i][c]는 1번 앱부터 i번 앱까지 각 앱을 선택 혹은 미선택하고 누적된 비용이 c일때의

확보된 메모리의 최대값을 저장하도록 했습니다.

 

N번째 앱까지 DP값을 모두 채운 후에는

DP[N][c] 에서 c(누적 비용)를 0부터 1씩 증가시키면서

처음으로 M 이상의 메모리를 확보할 수 있는 비용을 찾아서 출력하도록 했습니다.