- toc {:toc}
ํ์ด
๊ท์น ์ฐพ๋ ๊ฒ์ด ํ๋ค๋ค. dp ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
1, 2, 3 ์ ์ฌ์ฉํ๊ณ k=3 ์ธ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
| ์ฌ์ฉ ๋์ | 1 | 2 | 3 |
|---|---|---|---|
| 1 ์ | 1 | 1 | 1 |
| 2 ์ | 0 | 1 | 0 |
| 3 ์ | 0 | 0 | 1 |
| 1, 2 ์ | 1 | 2 | 2 |
| 1, 2, 3 ์ | 1 | 2 | 3 |
-
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 ๊ฐ โ ๋ก ์๊ฐํ ์ ์๋ค.
- 3 ์ 1 ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ dp[3] += dp[0] ์ผ๋ก ํํํ ์ ์๋ค. 3 ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ์กด์ ์์ด์ผ ํ ๋์ ์ด ์๊ธฐ ๋๋ฌธ์ 0 ์ ์๋ ๊ฒฝ์ฐ๋ก ๊ตฌํํ๋ค.
- 2 ์ 1 ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ dp[3] += dp[1] ๋ก ํํํ๋ค. 2 ์ 1 ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ์กด์ 1 ์ 1 ๊ฐ๊ฐ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ 1 ์์ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ํด์ค๋ค.
- 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;
}