λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/BOJ

[C++/BOJ] 2293 : 동전 1

 

문제

n가지 μ’…λ₯˜μ˜ 동전이 μžˆλ‹€. 각각의 동전이 λ‚˜νƒ€λ‚΄λŠ” κ°€μΉ˜λŠ” λ‹€λ₯΄λ‹€. 이 동전을 μ λ‹Ήνžˆ μ‚¬μš©ν•΄μ„œ, κ·Έ κ°€μΉ˜μ˜ 합이 k원이 λ˜λ„λ‘ ν•˜κ³  μ‹Άλ‹€. κ·Έ 경우의 수λ₯Ό κ΅¬ν•˜μ‹œμ˜€. 각각의 동전은 λͺ‡ κ°œλΌλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ‚¬μš©ν•œ λ™μ „μ˜ ꡬ성이 같은데, μˆœμ„œλ§Œ λ‹€λ₯Έ 것은 같은 κ²½μš°μ΄λ‹€.

μž…λ ₯

첫째 쀄에 n, kκ°€ 주어진닀. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) λ‹€μŒ n개의 μ€„μ—λŠ” 각각의 λ™μ „μ˜ κ°€μΉ˜κ°€ 주어진닀. λ™μ „μ˜ κ°€μΉ˜λŠ” 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 경우의 수λ₯Ό 좜λ ₯ν•œλ‹€. 경우의 μˆ˜λŠ” 231보닀 μž‘λ‹€.

 


 

λ°±μ€€ κ³¨λ“œ 5 문제!

λ°±νŠΈλž˜ν‚Ήμ΄λ‚˜ 완탐 문제일 쀄 μ•Œμ•˜λŠ”λ° μ•Œκ³ λ³΄λ‹ˆ dpμ˜€λ‹€....
 
 
0원인 경우의 μˆ˜λŠ” 1이닀. dp[0] = 1;
 
1원이 κ°€λŠ₯ν•œ 경우의 μˆ˜λŠ” 1μ›μ§œλ¦¬ 동전이 μžˆμ–΄μ•Ό μ„±λ¦½ν•œλ‹€. μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ dp[1] = 1;
 
2원이 κ°€λŠ₯ν•œ 경우의 μˆ˜λŠ” 2μ›μ§œλ¦¬ 동전이 μžˆλ‹€λ©΄ μΆ”κ°€λœλ‹€.
dp[2] = 2 = 'dp[1]+1μ›μ§œλ¦¬ 동전 λ”ν•˜λŠ” 경우' and '2μ›μ§œλ¦¬ 동전 ν•˜λ‚˜' ;
 

2μ›μ§œλ¦¬ 동전이 μ—†κ³  1μ›μ§œλ¦¬λ§Œ μžˆλ‹€λ©΄ dp[2] = 1 = 'dp[1]+1μ›μ§œλ¦¬ 동전 λ”ν•˜λŠ” 경우'

 

μ­‰ 생각해보면 κ²°κ΅­ dp[ i ] = 'dp[ i - 코인 λ‹¨μœ„ ] + κ·Έ 코인을 λ”ν•˜λŠ” 경우' 이닀.

 

μ—¬κΈ°μ„œλŠ” 코인이 μ—¬λŸ¬κ°œμ΄λ―€λ‘œ μœ„ 과정을 λ°˜λ³΅ν•˜μ—¬ λˆ„μ μ‹œν‚€λ©΄ λœλ‹€.

 

 

c++ 풀이

#include <iostream>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    int k;
    int coin[102] = {0,};
    int dp[10002] = {0,};
    cin >> n >> k;
    for (int i = 0; i < n; ++i){
        cin >> coin[i];
    }
    dp[0] = 1;
    
    for (int i = 0; i < n; ++i){
        for (int j = coin[i]; j <= k; ++j){
            dp[j] += dp[j - coin[i]];
        }
    }
    cout << dp[k];
    return 0;
}