[BOJ_Python] 1535. 안녕
2024. 12. 16. 09:00ㆍ[Algorithm]/문제 풀이
문제
https://www.acmicpc.net/problem/1535
사용 알고리즘
풀이
고려사항
1. 현재 부분 집합 기준에 인사 가능한 체력이 있는지
2. 인사 가능하다면, 인사 할지에 대한 여부 확
후기
1. 이 문제는 조건의 N이 20 이하이며, 체력은 100 미만이라는 작은 범위로 인해
Brute Force, 백트레킹, 0/1 Knapsack 모두 사용이 가능하다.
하지만, 가장 효율적인 방법으로 0/1 Knapsack을 적용하여 풀었다.
Brute Force : $ O(2^{N}) $
Knapsack : $ O(100 * N) $
2. 이후, 코드느 기본 Knapsack 코드와 동일하다.
코드
import sys
input = sys.stdin.readline
# 총인원
N = int(input())
# 사용되는 체력, 얻는 기쁨 관련 리스트
hp = [0] + list(map(int, input().split()))
joy = [0] + list(map(int, input().split()))
# knapsack 정보 업데이트
knapsack = [[0] * (100) for _ in range(N + 1)]
for i in range(1, N + 1): # 만나는 사람
for j in range(1, 100): # 사용된 체력
# 현재 만나는 사람만 인사했을 때에도 체력이 부족한 경우
if j < hp[i]:
knapsack[i][j] = knapsack[i - 1][j]
# 현재 만나는 사람과 인사가 가능한 경우
else:
# 인사를 하는 경우, 하지 않는 경우 비교
knapsack[i][j] = max(knapsack[i - 1][j], joy[i] + knapsack[i - 1][j - hp[i]])
print(knapsack[N][99])
결과
'[Algorithm] > 문제 풀이' 카테고리의 다른 글
[BOJ_Python] 1446. 지름길 (0) | 2025.03.18 |
---|---|
[BOJ_Python] 12865. 평범한 배낭 (1) | 2024.12.15 |
[BOJ_Python] 16493. 최대 페이지 수 (0) | 2024.12.14 |
[Softeer_Python] Lv3. 로봇이 지나간 경로 (1) | 2024.11.29 |
[BOJ_Python] 15663 ~15666. N과 M 시리즈 3 (9 ~ 12) (0) | 2024.11.27 |