티스토리 뷰
1. 문제
https://www.acmicpc.net/problem/12865
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
2. 설명
Knapsack Problem 알고리즘이라고 유명한 DP 문제이다.
점화식은 아래와 같다.
weight[i]<=j 일 때, dp[i][j] = Math.max(value[i]+dp[i-1][j-weight[i]], dp[i-1][j]) 라는 것
weight[i]>j 일 때는 dp[i][j] = dp[i-1][j] 이다.
3. 코드
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 물품의 수
int K = Integer.parseInt(st.nextToken()); // 준서가 버틸 수 있는 무게
int[][] dp = new int[N+1][K+1];
int[] weight = new int[N];
int[] value = new int[N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
weight[i] = Integer.parseInt(st.nextToken()); // 무게
value[i] = Integer.parseInt(st.nextToken()); // 가치
}
int max = 0;
for(int i=1; i<=N; i++) {
for(int j=1; j<=K; j++) {
if(weight[i-1]<=j)
dp[i][j] = Math.max(value[i-1]+dp[i-1][j-weight[i-1]], dp[i-1][j]);
else
dp[i][j] = dp[i-1][j];
max = Math.max(dp[i][j], max);
}
}
System.out.println(max);
}
}
'알고리즘 풀이 > 백준' 카테고리의 다른 글
백준 11723 집합 JAVA (bitmask 비트마스크) (0) | 2020.06.29 |
---|---|
백준 11399 ATM JAVA (0) | 2020.06.28 |
백준 2206 벽 부수고 이동하기 JAVA (BFS) (0) | 2020.06.24 |
백준 1697 숨바꼭질 (BFS) (0) | 2020.04.23 |
백준 7576 토마토 (BFS) (0) | 2020.04.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday