본문 바로가기
Algorithm/Baekjoon

Baekjoon 16493 최대 페이지 수 JAVA

by Hunveloper 2022. 7. 16.
728x90

 

16493번: 최대 페이지 수

첫째 줄에 N(1 ≤ N ≤ 200)과 챕터의 수 M(1 ≤ M ≤ 20)이 주어진다. 둘째 줄부터 각 챕터 당 읽는데 소요되는 일 수와 페이지 수가 주어진다. 소요되는 일 수는 20보다 작거나 같은 자연수이고, 페이

www.acmicpc.net

문제

철수는 한양대학교 도서관에서 책을 빌려놓고 까먹고 있다가 며칠 후 책을 반납해야 한다는 사실을 깨달았다. 남은 기간 동안 최대한 많은 페이지를 읽고 연체없이 반납하고 싶다.

빌린 책은 여러 챕터로 구성된 에세이집인데 챕터들은 서로 독립적이다. 즉, 어느 챕터를 읽기 위해 다른 챕터를 먼저 읽어야 할 필요가 없다. 철수는 중간에 관두는 것을 못견디는 성격이라, 한 챕터를 읽기 시작하면 끝까지 봐야한다. 

남은 기간 N일과, 책의 각 챕터 당 그 챕터를 전부 읽는데 소요되는 일 수와 페이지 수가 주어질 때, N일간 읽을 수 있는 최대 페이지 수를 구하는 프로그램을 작성하라.

입력

첫째 줄에 N(1 ≤ N ≤ 200)과 챕터의 수 M(1 ≤ M ≤ 20)이 주어진다. 둘째 줄부터 각 챕터 당 읽는데 소요되는 일 수와 페이지 수가 주어진다. 소요되는 일 수는 20보다 작거나 같은 자연수이고, 페이지 수는 300보다 작거나 같은 자연수이다.

출력

읽을 수 있는 최대 페이지 수를 출력한다.

풀이

다이나믹 프로그래밍을 이용한 배낭문제다.

날짜를 최대 가질 수 있는 무게, 읽을 수 있는 챕터의 수를 물건의 가치라고 생각하면 된다.

읽을 수 있는 챕터의 수는 소요되는 일 수 마지막에 추가된다.

첫 책을 읽고, 다음 책을 읽을때 n일을 뺀 날짜에서 읽을 수 있는 책을 추가하는 행위를 반복하면

가장 마지막날의 값이 읽을 수 있는 가장 많은 챕터의 수를 표현한다.

 

자세한 풀이

 

Baekjoon 12865 평범한 배낭 JAVA

12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의.

hunucho.tistory.com

코드
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n=Integer.parseInt(st.nextToken()), m=Integer.parseInt(st.nextToken());
		int [] days = new int[m], pages = new int[m], dp = new int[n+1];
		for(int i=0;i<m;i++) {
			st = new StringTokenizer(br.readLine());
			days[i]=Integer.parseInt(st.nextToken());
			pages[i]=Integer.parseInt(st.nextToken());
		}
		// i : n일째, dp[i] : i번째 읽을 수 있는 가장 많은 챕터 수
		for(int i=0;i<m;i++) {
			for(int j=n;j>=days[i];j--) {
				dp[j]=Math.max(dp[j], dp[j-days[i]]+pages[i]);	// n일째 읽을 수 있는 최대 페이지 수와, n일에서 현재 페이지를 빠진 날짜 + i번째 책의 페이지수를 계산
			}
		}
		System.out.println(dp[n]);
	}
}
728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 2170 선 긋기 JAVA  (0) 2022.07.24
Baekjoon 12865 평범한 배낭 JAVA  (0) 2022.07.16
Baekjoon 1535 안녕 JAVA  (0) 2022.07.07
Baekjoon 2864 5와 6의 차이 JAVA  (0) 2022.07.07
Baekjoon 10162 전자레인지 JAVA  (0) 2022.07.07

댓글