알고리즘/DP

[백준] 9084 동전

HJ39 2023. 4. 26. 16:52

배낭 관련 문제들 2문제를 풀고 약간의 고뇌의 시간(?)을 보내니까 약간 어느 정도 감이 올 듯 말 듯 한 거 같다.

 

예제로 나온 수들은 너무 크기 때문에 내 마음대로 돈의 크기를 대폭 줄여서 생각해 보았다.

 

N= 3, M= 20

동전의 종류: 1, 5, 10

n=5인 행의 10열 에 해당하는 숫자 3은 5원, 1원짜리 동전으로 구성할 수 있는 경우의 수를 계산한 값이다.

배낭 문제에서 흔히 나오는 방식은 j-array[i]를 이용하니 쉽게 규칙을 파악할 수 있었다..

 

 

□ 소스 코드

#include <bits/stdc++.h>

using namespace std;

void coin9084(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int testCase; cin>>testCase;
    
    for(int t=0; t<testCase; t++){
        int N; cin>>N;
        
        int array[N+1];
        for(int i=1;i<=N;i++)
            cin>>array[i];
        
        int M; cin>>M;
        int dp[N+1][M+1];
        
        for(int i=0; i<=N;i++)
            for(int j=0; j<=M;j++)
                dp[i][j] = 0;
        
        for(int i=1; i<=N;i++){
            for(int j=1; j<=M;j++){
                if (j == array[i])
                    dp[i][j] = dp[i-1][j] + 1;
                else if(j - array[i] >= 0){
                    dp[i][j] = dp[i][j-array[i]] + dp[i-1][j];
                }
                else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        
        cout<<dp[N][M]<<endl;
    
    }
    
}

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

[백준] 7579 앱  (0) 2023.04.26
[백준] 12865 평범한 배낭  (0) 2023.04.18
[백준] 1958 LCS 3  (1) 2023.04.16
[백준] 9251, 9252 LCS 1,2  (0) 2023.04.16
[백준] 2565, 2568 전깃줄 1, 2  (0) 2023.04.16