[백준 7579번 C/C++] 앱
[백준 7579번 C/C++] 앱

https://www.acmicpc.net/problem/7579
7579번: 앱
입력은 3줄로 이루어져 있다. 첫 줄에는 정수 N과 M이 공백문자로 구분되어 주어지며, 둘째 줄과 셋째 줄에는 각각 N개의 정수가 공백문자로 구분되어 주어진다. 둘째 줄의 N개의 정수는 현재 활
www.acmicpc.net
해결전략
Dynamic Programming 다이나믹 프로그래밍, 동적 계획법
배낭
해설
dp[ i ][ j ]
dp[ i ][ j ] = i개 이하의 메모리 앱을 사용하고, j 이하의 비용으로 확보할 수 있는 최대 메모리 크기
i \ j | ||||||||||||||||||
1 | 0 | 0 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | 30 | |||
2 | 10 | 10 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | 40 | |||
3 | 10 | 10 | 40 | 40 | 40 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | |||
4 | 10 | 10 | 40 | 40 | 45 | 60 | 60 | 75 | 75 | 75 | 95 | 95 | 95 | 95 | 95 | |||
5 | 10 | 10 | 40 | 50 | 50 | 60 | 80 | 80 | 85 | 100 | 100 | 115 | 115 | 115 | 135 |
i는 비활성할 메모리 앱의 수
j는 비활성하여 확보한 메모리
dp[ i ][ j ] = max (dp[ i - 1 ][ j ], dp[ i - 1 ][ j - cost[ i ]] + memory[ i ])

코드
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n, m; // n은 메모리 수, m은 필요한 메모리 바이트 vector<int> memory, cost; // memory[i]는 해당 앱의 메모리, cost[i]는 해당 앱의 비용 int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; memory.resize(n+1); // 앱의 메모리 정보를 저장할 배열 cost.resize(n+1); // 앱의 비용 정보를 저장할 배열 // 각 앱의 메모리 정보를 입력받아 저장 for (int i = 1; i <= n; i++) cin >> memory[i]; int totalCost = 0; // 모든 앱의 비용의 합을 저장할 변수 for (int i = 1; i <= n; i++) { cin >> cost[i]; totalCost += cost[i]; } // dp[i][j] = i개 이하의 메모리 앱을 사용하고, j 이하의 비용으로 확보할 수 있는 최대 메모리 크기 vector<vector<int>> dp(n + 1, vector<int>(totalCost + 1, 0)); for (int i = 1; i <= n; i++) { for (int j = 0; j <= totalCost; j++) { if (j >= cost[i]) // 현재 앱을 선택할 수 있는 경우와 선택하지 않는 경우 중에서 최대 메모리 크기 선택 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cost[i]] + memory[i]); else // 현재 앱의 비용이 선택 가능한 비용보다 크면 선택하지 않음 dp[i][j] = dp[i - 1][j]; } } //디버깅 cout << "\n"; for (int i = 1; i <= n; i++) { for (int j = 1; j <= totalCost; j++) { cout << dp[i][j] << " "; } cout << "\n"; } cout << "\n"; int answer = 0; // 필요한 메모리 크기인 m보다 크거나 같은 최소 비용을 찾아 answer에 저장 for (int j = 0; j <= totalCost; j++) { if (dp[n][j] >= m) { answer = j; break; } } cout << answer << "\n"; return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 16493번 C/C++] 최대 페이지 수 (0) | 2023.08.08 |
---|---|
[백준 9084번 C/C++] 동전 (0) | 2023.08.03 |
[백준 12865번 C/C++] 평범한 배낭 (0) | 2023.08.01 |
[백준 1629번 C/C++] 곱셈 (0) | 2023.07.31 |
[백준 13305번 C/C++] 주유소 (0) | 2023.07.28 |
댓글
이 글 공유하기
다른 글
-
[백준 16493번 C/C++] 최대 페이지 수
[백준 16493번 C/C++] 최대 페이지 수
2023.08.08 -
[백준 9084번 C/C++] 동전
[백준 9084번 C/C++] 동전
2023.08.03 -
[백준 12865번 C/C++] 평범한 배낭
[백준 12865번 C/C++] 평범한 배낭
2023.08.01 -
[백준 1629번 C/C++] 곱셈
[백준 1629번 C/C++] 곱셈
2023.07.31
댓글을 사용할 수 없습니다.