๐Ÿ•๏ธ ICPC Sinchon/Dynamic Programming

[BOJ][C++] ๋ฐฑ์ค€ 2293๋ฒˆ: ๋™์ „ 1

์„ ๋‹ฌ 2023. 11. 24. 14:08
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2293

 

2293๋ฒˆ: ๋™์ „ 1

์ฒซ์งธ ์ค„์— n, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ์˜ ๋™์ „์˜ ๊ฐ€์น˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋™์ „์˜ ๊ฐ€์น˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

 

๋ฌธ์ œ

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์›(์ฒซ๋ฒˆ์งธ ๋™์ „)์ด ํ•œ๋ฒˆ์ด๋ผ๋„ ํฌํ•จ๋˜๋ฉด ๊ฒ€์ •์ƒ‰

1์› ํฌํ•จ ์•ˆํ•˜๊ณ  2์›(๋‘๋ฒˆ์งธ ๋™์ „)์ด ํ•œ๋ฒˆ์ด๋ผ๋„ ํฌํ•จ๋˜๋ฉด ํŒŒ๋ž€์ƒ‰
1์›๊ณผ 2์› ํฌํ•จ ์•ˆํ•˜๊ณ  5์›(์„ธ๋ฒˆ์งธ ๋™์ „)์ด ํ•œ๋ฒˆ์ด๋ผ๋„ ํฌํ•จ๋˜๋ฉด ๋นจ๊ฐ•์ƒ‰

 

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

 

๋ฐ˜์‘ํ˜•