문제풀이/DP

[CodingTest] BOJ11052 카드 구매하기 ( DP ) With Python

IT록흐 2023. 6. 16. 17:49
반응형

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

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

 
 
◎ 문제풀이
 
카드팩 안에는 1 ~ N개의 카드가 들어있다. 카드팩의 비용은 개수에 상관없이 제각각이다. 민규가 N개의 카드를 구할 수 있는 비용의 최댓값을 구하는 문제이다. 
 
N개 목표가 주어졌고
1~N개가 카드팩으로 묶여 있으므로 기저조건이다. 
 
기저조건으로 목표를 구하는 문제이므로 DP로 풀면된다. 
 

 
 
4개의 카드의 최댓값을 구해보자. 4개의 카드를 구할 수 있는 사건은 4개가 있다.
 
첫번째 사건 : 1개 팩 비용 + 3개의 최댓값
두번째 사건 : 2개 팩 비용 + 2개의 최댓값
세번째 사건 : 3개 팩 비용 + 1개의 최댓값
네번째 사건  : 4개 팩 비용 
 
네 가지 사건 중 가장 최대인 값을 구하면 된다. 
 

◎ 코드

import sys 
input = sys.stdin.readline

n = int(input())
pack = [0] #팩
pack.extend(list(map(int,input().split()))) 

d= [0]*1001
d[1] = pack[1]

#BOTTOM-UP방식으로 최대비용 구하기 
for i in range(2,n+1) :
  d[i] = pack[i] # N가지 사건 중 최댓값 구하기
  for j in range(1,i) :
    d[i] = max(d[i],d[i-j] + pack[j])

#출력
print(d[n])

 
 
 

반응형