알고리즘/백준

백준_2839 : 설탕 배달 - C++

맏리믓 2023. 6. 25. 18:02

문제

 


문제 해석

- 숫자 3과 5를 최소한으로 사용하여 더해 주어지는 수 N 을 만들어 주면 되는 문제이다.


알고리즘

- DP 알고리즘을 사용하면 간단하게 해결 할 수 있다.

- 우선 무게가 3, 5인 경우에는 각 3kg, 5kg 봉지 하나씩 을 사용 하면 된다.

  - 이 경우 DP[3] -> 1, DP[5] -> 1 가 되게 된다.

- 여기서 부터 시작 하여 무게가 i 일 경우에 DP[i-3] 이 만들 수 있다면 DP[i] = DP[i-3] +1이 된다.

  - 그 이유는 DP[i-3] 에서 3kg 하나만 추가 하면되기 때문이다.

- 만약 DP[i-5] 가 존재 할 때는 같은 원리로 DP[i] = DP[i-5]+1 이 된다.

- 이때 주의 해야 할 점은 i 가 '8' 같은 경우이다.

  - 이 경우에는 '8 - 3 == 5', '8 - 5 == 3' 이기 때문에 DP[i-3]과 DP[i-5] 가 동시에 존재한다.

  - 이럴 때는 두가지중 더 봉지를 적게 쓰는 경우를 대입 해 주면 된다.

    -ex) dp[i] = min(dp[i-3] + 1, dp[i-5] + 1);


코드

- 이 코드 같은 경우는 if(dp[i-3] != 0) 에서 dp[i] 에 dp[i-3] +1을 대입 했기 때문에 dp[i] = min(dp[i], dp[i-5] + 1); 로 함

#include <iostream>
using namespace std;

int dp[5001];
int N;

int main(){
    cin >> N;
    dp[3] = dp[5] = 1;
    for(int i = 6; i <= N; i++){
        if(dp[i-3] != 0){
            dp[i] = dp[i-3] + 1;
        }
        if(dp[i-5] != 0){
            if(dp[i] != 0){
                dp[i] = min(dp[i], dp[i-5] + 1);
            } else {
                dp[i] = dp[i-5] + 1;
            }
        }
    }
    if(dp[N] == 0){
        cout << -1 << '\n';
    } else {
        cout << dp[N] << '\n';
    }
}