[BOJ/Java] 1535: 안녕

2025. 5. 18. 18:55·Problem Solving/BOJ
문제

https://www.acmicpc.net/problem/1535

총 N명의 사람이 있다.

사람과 악수를 하게 되면, 체력은 잃고 기쁨을 얻는다.

체력은 100이며, 체력이 0이나 음수가 되지 않으면서 얻을 수 있는 최대의 기쁨을 구해야 한다.

 

 풀이

문제 자체는 0-1 배낭 문제와 같다. 하지만 평범한 배낭(https://www.acmicpc.net/problem/12865)보다는 인풋 값이 작아 다른 알고리즘을 시도해도 괜찮다.

 

알고리즘은 다음과 같다.

  1. cost[i]는 i번째 사람에게 잃는 체력, value[i]는 i번째 사람에게 얻을 수 있는 기쁨이다.
  2. dp[i][j]는 i번째 사람까지 고려했을 때, 체력을 j만큼 썼을 때의 최대 기쁨이다.
  3. 현재 사람과 악수할 수 없는 경우(현재 체력보다 잃는 체력이 크거나 같은 경우), 이전 값을 선택한다. (dp[i][j] = dp[i-1][j]) (체력이 0이나 음수가 되기 때문이다.)
  4. 현재 사람과 악수할 수 있는 경우, 이전 값과 현재 사람과 악수해서 얻을 수 있는 기쁨을 비교해서 더 큰 값을 선택한다. (max(dp[i-1][j], dp[i-1][j - cost[i]] + value[i])

 

코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        int n = Integer.parseInt(br.readLine());

        int[] cost = new int[n+1];
        int[] value = new int[n+1];

        StringTokenizer st1 = new StringTokenizer(br.readLine());
        StringTokenizer st2 = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            cost[i] = Integer.parseInt(st1.nextToken());
            value[i] = Integer.parseInt(st2.nextToken());
        }

        int health = 100;
        int[][] dp = new int[n+1][health+1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= health; j++) {
                if (cost[i] >= j) {
                    dp[i][j] = dp[i-1][j];
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - cost[i]] + value[i]);
                }
            }
        }

        System.out.println(dp[n][health]);
    }

}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ/Java] 1463: 1로 만들기  (2) 2025.06.02
[BOJ/Java] 2225: 합분해  (1) 2025.05.26
[BOJ/Java] 16174: 점프왕 쩰리 (Large)  (0) 2025.05.18
[BOJ/Java] 17951: 흩날리는 시험지 속에서 내 평점이 느껴진거야  (0) 2025.05.16
[BOJ/Java] 23288: 주사위 굴리기 2  (0) 2025.05.16
'Problem Solving/BOJ' 카테고리의 다른 글
  • [BOJ/Java] 1463: 1로 만들기
  • [BOJ/Java] 2225: 합분해
  • [BOJ/Java] 16174: 점프왕 쩰리 (Large)
  • [BOJ/Java] 17951: 흩날리는 시험지 속에서 내 평점이 느껴진거야
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    N과 M
    그리디
    java
    백트래킹
    dfs
    백준
    intersection observer
    소수 판별
    코드트리
    삼성 sw 역량테스트
    완전 탐색
    구간 합
    dp
    누적 합
    투 포인터
    BFS
    정렬
    이분 탐색
    구현
    매개 변수 탐색
    수학
    react
    순열
    JavaScript
    맵
    문자열
    집합
    vite
    프로그래머스
    시뮬레이션
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[BOJ/Java] 1535: 안녕
상단으로

티스토리툴바