Algorithm/BOJ

[백준] 9084번 동전

면빈이 2020. 1. 10. 21:45

[적용한 알고리즘]

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