• toc {:toc}

๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

๊ทœ์น™ ์ฐพ๋Š” ๊ฒƒ์ด ํž˜๋“ค๋‹ค. dp ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
1, 2, 3 ์„ ์‚ฌ์šฉํ•˜๊ณ  k=3 ์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

์‚ฌ์šฉ ๋™์ „123
1 ์›111
2 ์›010
3 ์›001
1, 2 ์›122
1, 2, 3 ์›123
  • 1 ์›๋งŒ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 1 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 1 ์› ๋งŒ๋“ค๊ธฐ
    1 ์› 2 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 2 ์› ๋งŒ๋“ค๊ธฐ
    1 ์› 3 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 3 ์› ๋งŒ๋“ค๊ธฐ

  • 2 ์›์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 2 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 2 ์› ๋งŒ๋“ค๊ธฐ
    2 ์› 1 ๊ฐœ, 1 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 3 ์› ๋งŒ๋“ค๊ธฐ

  • 3 ์›์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 3 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด 3 ์› ๋งŒ๋“ค๊ธฐ

2 ์›, 3 ์›์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋™์ „๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.

3 ์›์„ ๋งŒ๋“ค๋ ค๋Š” ๊ฒฝ์šฐ๋Š” 3 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, 2 ์› 1 ๊ฐœ์™€ 1 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, 1 ์› 3 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ dp ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด dp[3] = 1 ์˜ ๊ฒฝ์šฐ โ€œ3 ์›์„ ๋งŒ๋“ค๋ ค๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1 ๊ฐœ โ€ ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. 3 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ dp[3] += dp[0] ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 3 ์›์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด์— ์žˆ์–ด์•ผ ํ•  ๋™์ „์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— 0 ์„ ์—†๋Š” ๊ฒฝ์šฐ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  2. 2 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ dp[3] += dp[1] ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 2 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด์— 1 ์› 1 ๊ฐœ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1 ์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋”ํ•ด์ค€๋‹ค.
  3. 1 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ dp[3] += dp[2] ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1 ์› 1 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด์— 2 ์› 1 ๊ฐœ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 2 ์›์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋”ํ•ด์ค€๋‹ค.

๋•Œ๋ฌธ์— ํ•ด๋‹น ๋™์ „์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค๋ ค๋ฉด ๋งŒ๋“ค๋ ค๋Š” ๋™์ „์˜ ์ˆ˜์—์„œ ํ•ด๋‹น ๋™์ „์„ ๋นผ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
ex) 2 ์›์„ ์ด์šฉํ•ด 3 ์›์„ ๋งŒ๋“ค๋ ค๋Š” ๊ฒฝ์šฐ : dp[3 - 2]

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
 
int coin[105];
int dp[10005];
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    int n, k;
 
    cin >> n >> k;
 
    for(int i = 1; i <= n; i++){
        cin >> coin[i];
    }
 
    dp[0] = 1;
    for(int i = 1; i <= n; i++){
        for(int j = coin[i]; j <= k; j++){
            dp[j] = dp[j] + dp[j - coin[i]];
        }
    }
 
    cout << dp[k] << endl;
 
    return 0;
}