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 |