문제 링크
https://www.acmicpc.net/problem/12865
문제를 보고 dp로 어떻게 접근을 해야 할지 많이 고민함. 그러다가 베낭이 담을 수 있는 최대 무게를 1부터 [k] 일 때와 주어진 물건을
1개 ~ n개일 때를 각각 나눠 반복문으로 비교 작업 수행
int[][] dp = new int[물건 배열 length + 1][k + 1];
for(int index = 1; index < dp.length; index++) {
for(int 현재무게 = 1; 현재무게 <= k; 현재무게++) {
dp[index][현재무게] = /* 비교 로직 수행 */
}
}
그러고 문제에서 요구하는 상황은 dp[물건배열.length][k]에 값이 저장되어 있기 때문에 이 값을 반환하면 됨.
전체 코드
더보기
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int weight;
static int[] weights, values;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int count = Integer.parseInt(st.nextToken());
weight = Integer.parseInt(st.nextToken());
weights = new int[count+1];
values = new int[count+1];
for(int i = 1; i <= count; i++) {
st = new StringTokenizer(br.readLine());
weights[i] = Integer.parseInt(st.nextToken());
values[i] = Integer.parseInt(st.nextToken());
}
//배낭에 물건을 담을만한 기준을 선택하지
/*
물건이 2개만 있을 때
담을 수 있는 무게 내에서 가치가 더 큰 것.
dp
*/
int[][] dp = new int[count + 1][weight + 1];
for(int t = 1; t < dp.length; t++) {
for(int w = 1; w < dp[t].length; w++) { //현재 무게
if(weights[t] > w) {
dp[t][w] = dp[t-1][w];
} else {
//물건을 담을 떄와 담지 않을 때 비교,
// 담을 때는 해당 무게가 추가 되기 전의 가치에서 담을 무게의 가치를 합한다.
dp[t][w] = Math.max(dp[t-1][w], dp[t-1][w-weights[t]]+values[t]);
}
}
}
bw.write(""+dp[count][weight]);
bw.flush();
br.close();
bw.close();
}
}
정리
- 문제를 어떻게 분할할 것인지 충분히 생각해보자.
300x250
'알고리즘 & 코딩 테스트' 카테고리의 다른 글
[Solved.ac] Dyanmic Programming 문제 해결 과정(Java) (0) | 2024.06.20 |
---|---|
[프로그래머스] Lv.2 괄호 회전하기 해결 과정(Java) (0) | 2024.06.19 |
[프로그래머스] Lv.3 파괴되지 않은 건물 해결 과정(Java) (0) | 2024.06.17 |
[프로그래머스] Lv.3 부대 복귀 문제 해결 과정(Java) (3) | 2024.06.13 |
[프로그래머스] Lv.3 섬 연결하기 문제 해결 과정(Java) (1) | 2024.06.10 |