스마트폰에서는 백그라운드에 활성화된 앱들이 메모리에 남아 있어,
앱을 재실행할 때 빠르게 복원할 수 있지만 메모리가 한정적입니다.
새 앱을 실행하려면 추가로 필요한 메모리를 확보하기 위해 일부 앱을 비활성화해야 합니다.
memory[i]
바이트 price[i]
(0~100) 아이디어: DP의 두 번째 차원을 ‘비용 합(cost)’으로 바꾼다!
dp[i][cost] = "앱 1..i를 고려했을 때, 비용 합이 cost일 때 확보할 수 있는 최대 메모리"
dp[i][cost] = dp[i-1][cost]
dp[i][cost] = max(
dp[i][cost],
dp[i-1][cost - price[i]] + memory[i]
)
int maxCost = N * 100;
int[][] dp = new int[N + 1][maxCost + 1];
// DP 테이블 채우기
for (int i = 1; i <= N; i++) {
for (int cost = 0; cost <= maxCost; cost++) {
// 1) 앱 i 비활성화 안 함
dp[i][cost] = dp[i - 1][cost];
// 2) 앱 i 비활성화
if (cost >= price[i]) {
dp[i][cost] = Math.max(
dp[i][cost],
dp[i - 1][cost - price[i]] + memory[i]
);
}
}
}
// 최소 비용 찾기
int answer = Integer.MAX_VALUE;
for (int cost = 0; cost <= maxCost; cost++) {
if (dp[N][cost] >= M) {
answer = cost;
break; // 최초 발견이 최소 비용
}
}
System.out.println(answer);