어흥
[SWEA 5215] 햄버거 다이어트 (JAVA) 본문
728x90
반응형
문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWT-lPB6dHUDFAVT
1. 주의할 점
- 조합, DP를 통한 풀이 방법이 있지만, DP(메모아이징)를 통해 해결한다
- 시작 전, DP[][]의 값을 전부 초기화한다
2. 구현
- DP[Idx][Remain] 배열을 통해 해당 Idx의 위치에서 Remain만큼 남은 칼로리가 있을 때, 얻을 수 있는 가장 큰 점수를 저장한다
- Knapsack 알고리즘을 통해 해당 'Idx의 위치에 있는 재료를 추가해서 얻을 수 있는 가장 큰 점수'와 '해당 재료를 추가하지 않고 얻을 수 있는 가장 큰 점수'중에서 가장 큰 점수를 DP에 저장한다
- 계산한 값과 Result값을 비교하여 큰 값을 Result에 할당한다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution_d3_5215_햄버거다이어트 {
static int num, limit,result;
static int val[], weight[],dp[][];
static int knapsack(int idx, int remain) {
if(idx==num) return 0;
int temp = dp[idx][remain];
if(temp!=-1) return temp;
if(weight[idx]<=remain)
temp = knapsack(idx+1,remain-weight[idx])+val[idx];
temp = Math.max(temp, knapsack(idx+1,remain));
result = Math.max(result, temp);
return dp[idx][remain]=temp;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int test = Integer.parseInt(br.readLine().trim());
for(int t=1;t<=test;t++) {
String s = br.readLine();
StringTokenizer st = new StringTokenizer(s);
num = Integer.parseInt(st.nextToken());
limit = Integer.parseInt(st.nextToken());
result=0;
val = new int[num];
weight = new int[num];
dp = new int[num][limit+1];
for(int i=0;i<num;i++) {
String str = br.readLine();
StringTokenizer st2 = new StringTokenizer(str);
val[i] = Integer.parseInt(st2.nextToken());
weight[i] = Integer.parseInt(st2.nextToken());
for(int j=0;j<=limit;j++)
dp[i][j]=-1;
}
knapsack(0,limit);
System.out.println("#"+t+" "+result);
}
}
}
728x90
반응형
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA 5658] 보물상자 비밀번호 (Java) (0) | 2020.04.29 |
---|---|
[SWEA 1767] 프로세서 연결하기 (C++) (0) | 2020.04.26 |
[SWEA 1263] 사람 네트워크2 (Dijkstra, Floyd-Warshall)(JAVA) (0) | 2020.04.10 |
[SWEA 9659] 다항식 계산 (JAVA) (0) | 2020.04.03 |
[SWEA 9760] Pocker Game (JAVA) (0) | 2020.04.02 |
Comments