1 분 소요

1. 문제

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

  • 브루투포스, DP 문제
// 문제
세준이는 성형수술을  후에 병원에 너무 오래 입원해 있었다. 
이제 세준이가 병원에 입원한 동안 
자기를 생각해준 사람들에게 감사하다고 말할 차례이다.

세준이를 생각해준 사람은  N명이 있다. 
사람의 번호는 1번부터 N번까지 있다. 
세준이가 i번 사람에게 인사를 하면 L[i]만큼의 체력을 잃고, 
J[i]만큼의 기쁨을 얻는다. 
세준이는 각각의 사람에게 최대 1번만 말할  있다.

세준이의 목표는 주어진 체력내에서 최대한의 기쁨을 느끼는 것이다. 
세준이의 체력은 100이고, 기쁨은 0이다. 
만약 세준이의 체력이 0이나 음수가 되면, 
죽어서 아무런 기쁨을  느낀 것이 된다. 
세준이가 얻을  있는 최대 기쁨을 출력하는 프로그램을 작성하시오.

// 입력
첫째 줄에 사람의  N( 20) 들어온다. 
둘째 줄에는 각각의 사람에게 인사를  , 
잃는 체력이 1 사람부터 순서대로 들어오고, 
셋째 줄에는 각각의 사람에게 인사를  , 
얻는 기쁨이 1 사람부터 순서대로 들어온다. 
체력과 기쁨은 100보다 작거나 같은 자연수 또는 0이다.

// 출력
첫째 줄에 세준이가 얻을  있는 최대 기쁨을 출력한다.

// 예제 입력 1 
3
1 21 79
20 30 25

// 예제 출력 1 
50

// 예제 입력 2 
1
100
20

// 예제 출력 2 
0

// 예제 입력 3 
8
100 15 1 2 3 4 6 5
49 40 1 2 3 4 5 4

// 예제 출력 3 
59

// 예제 입력 4 
4
100 50 20 13
20 30 40 50

// 예제 출력 4 
120

// 예제 입력 5 
8
100 26 13 17 24 33 100 99
34 56 21 1 24 34 100 99

// 예제 출력 5 
135

// 예제 입력 6 
12
1 1 1 1 1 1 1 1 1 1 1 1
100 100 100 100 100 100 100 100 100 100 100 100

// 예제 출력 6 
1200


2. 핵심 아이디어

  • 냅색 알고리즘 사용
  • 브루투포스로도 해결 가능


3. Python 문제풀이

import sys
input = sys.stdin.readline

n = int(input())
s = [0] + list(map(int, input().split()))
p = [0] + list(map(int, input().split()))
dp = [[0] * 101 for _ in range(n + 1)]

for i in range(1, n+1) :
  for j in range(1, 101) :
    if s[i] <= j :
      dp[i][j] = max(dp[i-1][j], dp[i-1][j - s[i]] + p[i])
    else :
      dp[i][j] = dp[i-1][j]

print(dp[n][99])


4. Java 문제풀이


댓글남기기