반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 7579 앱 본문

백준(Baekjoon) 문제

백준 7579 앱

huiung 2019. 10. 13. 22:34
반응형

https://www.acmicpc.net/problem/7579

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 여러개의 앱이 실행 중일때 각 앱을 비활성화 하는 비용과 그로인해 얻을 수 있는 메모리가 있을 때 요구하는 메모리를 확보할 수 있는 최소의 비용을 구하는 문제입니다. 모든 경우를 다 해봐야 하므로 dp를 이용하여야 합니다.

 

dp식을 어떻게 만들지 생각해 보면 2차원 dp를 선언하고 dp[i][j] 의 의미는 i번째 앱까지 중 j코스트로 얻을 수 있는 최대의 byte를 의미합니다. 따라서 아래식과 같이 dp[i][j]에서 i번째 앱을 비활성화 시킨 경우와 그렇지 않은 경우중 max값을 취하면서 반복문을 돌아주어야 합니다.

 

if(j-cost[i] >= 0)
             dp[i][j] = max(dp[i][j], dp[i-1][j-cost[i]]+byte[i]);  //i번째 앱 활성화

 

dp[i][j] = max(dp[i][j], dp[i-1][j]); //i번째 앱 비활성화

 

이러한 값들중 요구 하는 바이트를 만족하는 가장작은 코스트 값j를 찾으면 됩니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <algorithm>

using namespace std;

int N, M;
int dp[110][11000];


int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	int mem[110];
	int cost[110];

	cin >> N >> M;
	for (int i = 0; i < N; i++)
		cin >> mem[i];

	for (int i = 0; i < N; i++)
		cin >> cost[i];

	dp[0][cost[0]] = mem[0];
	int ans = 100000;
	if (mem[0] >= M) ans = cost[0];


	for (int i = 1; i < N; i++) {
		for (int j = 10000; j >= 0; j--) {
			
			dp[i][j] = max(dp[i][j], dp[i - 1][j]);

			if (j - cost[i] < 0) continue;
						
			dp[i][j] = max(dp[i][j], dp[i-1][j - cost[i]] + mem[i]);

			if (dp[i][j] >= M) ans = min(ans, j);			
		}
	}
	cout << ans;


	return 0;
}

 

 

반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1256 사전  (0) 2019.11.01
백준 2281 데스노트  (0) 2019.10.13
백준 11570 환상의 듀엣  (0) 2019.10.13
백준 7569 토마토  (0) 2019.09.16
백준 16500 문자열 판별  (0) 2019.09.05