• 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;
}