다이나믹 프로그래밍 문제2 in python

9566·2021년 6월 16일
1

알고리즘 스터디

목록 보기
10/11
post-thumbnail

문제 1


수기코드



코드

n = int(input())
array = list(map(int, input().split()))
# 순서를 뒤집어 '최장 증가 부분 수열' 문제로 변환
array.reverse()

# 테이블 초기화
dp = [1] * n

# 가장 긴 증가하는 부분 수열(LIS) 알고리즘 수행
for i in range(1, n):
    for j in range(0, i):
        if array[j] < array[i]:
            dp[i] = max(dp[i], dp[j] + 1)

# 열외해야 하는 병사의 최소 수를 출력
print(n - max(dp))

정답




문제 2


수기코드



코드

n, m = map(int, input().split()) #3종류, 700원 
array = [] #200원, 300원, 500원
for i in range(n): 
    array.append(int(input()))

# 테이블 초기화
d = [10001] * (m + 1)

# 다이나믹 프로그래밍 진행(보텀업)
d[0] = 0
for i in range(n):
    for j in range(array[i], m + 1, 100): 
    # (200~700, 300~700, 500~700), (701),100원단위로
        if d[j - array[i]] != 10001:
            d[j] = min(d[j], d[j - array[i]] + 1)

# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
    print(-1)
else:
    print(d[m])

정답

profile
안녕하세요 안녕안녕하세요 안녕하세요오오오~~

0개의 댓글

Powered by GraphCDN, the GraphQL CDN