https://www.acmicpc.net/problem/2293
๋ฌธ์
n๊ฐ์ง ์ข ๋ฅ์ ๋์ ์ด ์๋ค. ๊ฐ๊ฐ์ ๋์ ์ด ๋ํ๋ด๋ ๊ฐ์น๋ ๋ค๋ฅด๋ค. ์ด ๋์ ์ ์ ๋นํ ์ฌ์ฉํด์, ๊ทธ ๊ฐ์น์ ํฉ์ด k์์ด ๋๋๋ก ํ๊ณ ์ถ๋ค. ๊ทธ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ์์ค. ๊ฐ๊ฐ์ ๋์ ์ ๋ช ๊ฐ๋ผ๋ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉํ ๋์ ์ ๊ตฌ์ฑ์ด ๊ฐ์๋ฐ, ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ n, k๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) ๋ค์ n๊ฐ์ ์ค์๋ ๊ฐ๊ฐ์ ๋์ ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ค. ๋์ ์ ๊ฐ์น๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฒฝ์ฐ์ ์๋ 231๋ณด๋ค ์๋ค.
ํ์ด
dp๋ฌธ์ ๊ธดํ๋ฐ ์กฐ๊ธ ์๊ฐ์ด ํ์ํ๋ค
์์ ์ ๋์์๋ 1,2,5์์ผ๋ก 10(k)์์ ๋ง๋๋ ๊ฒฝ์ฐ๋ค์ ์๊ฐํด๋ณด์
1์ | 1
2์ | 11 2
3์ | 111 21
4์ | 1111 211 22
5์ | 11111 2111 221 5
6์ | 111111 21111 2211 222 51
7์ | 1111111 211111 22111 2221 511 52
8์ | 11111111 2111111 221111 22211 5111 521 2222
9์ | 111111111 21111111 2211111 222111 51111 5211 22221 522
10์ | 1111111111 211111111 22111111 2221111 511111 52111 222211 5221 22222 55
a. 1์์ผ๋ก๋ง ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ - ํ๋
b. 1์๊ณผ 2์์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ - ๊ฒ์
c. 1์๊ณผ 2์๊ณผ 5์์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ - ๋นจ๊ฐ
์ธ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์๊ฐํด์ค์ผ ์ค๋ณต์ ๋ฐฉ์งํ ์ ์๋ค
a b c์ ๊ฒฝ์ฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ตฌํ์
dp[i] = i์์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์
a ) 1 1 1 1 1 1 1 1 1 1
b ) 1 2 2 3 3 4 4 5 5 6
c ) 1 2 2 3 4 5 6 7 8 10
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n,k;
cin >> n >> k;
vector<int>v;
for(int i=0; i<n; i++) {
int tmp;
cin >> tmp;
if(tmp>k) continue;
v.push_back(tmp);
}
n = v.size();
sort(v.begin(), v.end());
vector<long long>dp(k+1, 0);
for(int i=0; i<n; i++) {
int coin = v[i];
dp[coin]++;
for(int j=coin+1; j<=k; j++) {
dp[j] += dp[j-coin];
}
}
cout << dp[k];
}โ
์ํ์ฐฉ์ค - ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ
2์ฐจ์ dp๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ ๋ฐฉ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋จ๋๋ผ..
1์ | 1
2์ | 11 2
3์ | 111 21
4์ | 1111 211 22
5์ | 11111 2111 221 5
6์ | 111111 21111 2211 222 51
7์ | 1111111 211111 22111 2221 511 52
8์ | 11111111 2111111 221111 22211 5111 521 2222
9์ | 111111111 21111111 2211111 222111 51111 5211 22221 522
10์ | 1111111111 211111111 22111111 2221111 511111 52111 222211 5221 22222 55
1์(์ฒซ๋ฒ์งธ ๋์ )์ด ํ๋ฒ์ด๋ผ๋ ํฌํจ๋๋ฉด ๊ฒ์ ์
v[i] = i๋ฒ์งธ ๋์ ์ ๊ฐdp[k][i] = i๋ฒ์งธ ๋์ ๊ณผ ๊ทธ ๋ค์ ๋์ ๋ค๋ก๋ง K์์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์ ๋ก ๋๋ค
์ฆ ์์ ์์๋dp[k][0] = dp[k-1][0] + dp[k-2][1] + dp[k-5][2];dp[k][1] = dp[k-2][1] + dp[k-2][2];dp[k][2] = dp[k-5][2];
๊ธ์ก 1 2 3 4 5 6 7 8 9 10
๊ฒ์ 1 1 2 2 3 4 5 6 7 8
ํ๋ 0 1 0 1 0 1 1 1 1 1
๋นจ๊ฐ 0 0 0 0 1 0 0 0 0 1
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n,k;
cin >> n >> k;
vector<int>v(n);
vector<vector<long long>>dp(k+1, vector<long long>(n, 0));
for(int i=0; i<n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
for(int i=0; i<n; i++) {
if(v[i]>k) break;
dp[v[i]][i] = 1;
}
for(int i=1; i<k+1; i++) {
for(int j=0; j<n; j++) {
int coin = v[j];
if(i-coin <= 0) break;
int sum = 0;
for(int h=j; h<n; h++) {
dp[i][j] += dp[i-coin][h];
}
}
}
long long ans = 0;
for(int i=0; i<n; i++) {
ans += dp[k][i];
}
cout << ans;
}
'๐๏ธ ICPC Sinchon > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 1699๋ฒ: ์ ๊ณฑ์์ ํฉ (0) | 2024.08.14 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 8394๋ฒ: ์ ์ (0) | 2024.08.14 |
[BOJ][C++] ๋ฐฑ์ค 11052๋ฒ: ์นด๋ ๊ตฌ๋งคํ๊ธฐ (0) | 2023.11.20 |
[BOJ][C++] ๋ฐฑ์ค 1890๋ฒ: ์ ํ (0) | 2023.11.14 |
[BOJ][C++] ๋ฐฑ์ค 1309๋ฒ: ๋๋ฌผ์ (0) | 2023.11.13 |