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

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

설탕 배달은 DP와 그리드 방식으로 해결 가능합니다. 사실 시간이 적다면 그리드 방식이 좋을 수 있지만

해당 문제는 DP 문제로 분류되어있으니 DP 방식으로 풀도록 하겠습니다.

 

해당 문제의 점화식입니다.

min(dp[j], dp[j-arr[i]] +1)

 

해당 문제의 풀이입니다.

n = int(input())
arr = [3, 5]
dp = [5001]*(n+1)
dp[0] = 0

for i in range(len(arr)):
    for j in range(arr[i], n+1):
        if dp[j - arr[i]] != 5001:
            dp[j] = min(dp[j], dp[j-arr[i]] +1)
if dp[n] == 5001:
    print(-1)
else:
    print(dp[n])

동적 계획법 방식중에서도 다운 - 탑 방식을 선택했습니다.

DP의 크기는 N+1의 크기로 생성합니다.

DP의 0번째 인덱스의 값은 0으로 생성하고 나머지는 5001의 값을 넣습니다.

5001의 값을 넣은 이유는 5001 값이 가장 최고 값이 될 것이기 때문입니다.

설탕 봉투의 키로 수는 3KG, 5KG 가 있습니다.

따라서 작은 설탕 봉투 3KG를 먼저 DP에값을 채워 넣습니다.

그다음에 5KG 봉투를 채워 넣습니다.

5키로 봉투를 채워 넣을 때 만약 현재 인덱스가 8이면 

8에는 5001의 값이 들어가 있을 것입니다.

8일 때 DP [8-5]의 값을 확인할 것이고 확인된 값은 DP [3] = 1 일 것입니다.

값을 비교하게되면 min(5001, 2)가 될 것이고 2의 값이 들어가게 될 것입니다.

위와 같은 방식으로 해당 인덱스의 가장 작은 수가 값으로 들어올 것입니다.

'알고리즘' 카테고리의 다른 글

이것이 코딩 테스트이다 - 모험가 길드  (0) 2022.01.03
백준 피보나치의 수5  (0) 2021.12.29
떡복기 떡 만들기 이진 탐색  (0) 2021.12.20
부품 찾기  (0) 2021.12.19
두 배열의 원소 교체  (0) 2021.12.19

+ Recent posts