Closed icegosimperson closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
01 배낭 문제
-> dpdp[]
: 비용으로 확보할 수 있는 최대 메모리dp[j] = Math.max(dp[j], dp[j-cost[i]] + memory[i]);
int[] dp = new int[sum+1]; // 비용으로 확보할 수 있는 최대 메모리, sum 최대 = (100 * 100) = 10000
for(int i=0; i<N; i++){
for(int j=sum; j>=cost[i]; j--){
dp[j] = Math.max(dp[j], dp[j-cost[i]] + memory[i]);
}
}
for(int i=0; i<=sum; i++){
if(dp[i]>=M){
System.out.println(i);
break;
}
}
🤔 시간복잡도 고려사항
O(N)
💡 풀이 아이디어
01배낭문제
01배낭문제
는 중복값을 허용하지 않아야하기에 for문 거꾸로 탐색
INF로 초기화를 해줘야하고 뭔가 직관적이지 못함.. "비용"을 기준으로 점화식 변경
dp[j] = Math.max(dp[j], dp[j - cost[i]] + memo[i]);
dp.. 뭔가 느낌만을 가지고 점화식을 세우는거같아서, 좀 더 초기값이나 세부 내용들을 확실하게 하는 연습을 해야겠다!
🤔 시간복잡도 고려사항
1 <= 앱의 개수 <= 100
, 1 <= 메모리 바이트 <= 10_000_000
2^100
(시간 초과)O(NlogN)
💡 풀이 아이디어
App[] apps
: 앱에 대한 정보 저장
int m
: 바이트, int c
: 비용 int[][] knapsack
: M바이트를 확보하기 위해 필요한 앱 비활성화 최소을 구하기 위한 2차원 배열
🤔 시간복잡도 고려사항
=> 활성화 하기 or 비활성화하기 : 완전탐색(2^100)은 불가 X => 최대 비용 : 100 100이므로 N 최대비용 O (DP로 해결해보기)
💡 풀이 아이디어
문제를 제대로 읽지 않고
dp[i][j]: i번째까지 탐색했을 때, j메모리를 비활성화할 수 있는 최대 비용
을 구하려고해서 메모리초과과 났습니다.... 다양한 냅색문제를 더 연습해야곘습니다~
🤔 시간복잡도 고려사항
N x 최대 비용
을 이용한 DP로 풀이0-1 knapsack
💡 풀이 아이디어
0-1 knapsack
을 활용1차원 배열로 풀려다가 혼났습니다 → 중복을 허용하는 knapsack
🤔 시간복잡도 고려사항
1 ≤ N ≤ 100
, 배터리 0 ≤ c1, ..., cN ≤ 100
O(N*C)
는 100*100 = 10^4
💡 풀이 아이디어
dp[비용] = 메모리
1차원 dp배열을 특정 비용일 때 최대 메모리 값을 구하는 방식으로 접근
"특정 비용의 최대 메모리" 를 구하는 이유?
역순으로 순회하는 이유?