[적용한 알고리즘]

DP

 

[아이디어]

중복을 없애주기 위해, 

첫번째 동전을 이용하는 경우를 다 더해주고,

두번째 동전을 이용하는 경우를 다 더해주고,

세번째 동전을 이용하는 경우를 다 더해주고,

쭉쭉 더해주면 된다.

 

[교훈]

중복 없애는 테크닉이 상당히 아름다웠다.

 

<코드>

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;


int main(){
    int t;
    scanf("%d", &t);

    while (t--){
        int N, M;
        int dp[10001] = { 0 };
        scanf("%d", &N);

        int coin[21] = { 0 };

        for (int i = 0; i < N; i++){
            scanf("%d", coin + i);
        }

        sort(coin, coin + N);
        scanf("%d", &M);

        dp[0] = 1;

        for (int i = 0; i < N; i++){
            for (int j = coin[i]; j <= M; j++){
                dp[j] += dp[j - coin[i]];
            }
        }

        printf("%d\n", dp[M]);
    }
    return 0;
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 1922번 네트워크 연결  (0) 2020.01.10
[백준] 2482번 색상환  (2) 2020.01.10
[백준] 9507번 Generations of Tribbles  (121) 2020.01.10
[백준] 2240번 자두나무  (0) 2020.01.10
[백준] 1390번 테트리스  (128) 2020.01.07

+ Recent posts