<링크>

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



<dfs_소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int N;
int dfs(int);
int main()
{
    int T;
    scanf("%d"&T);
    while (T--)
    {
        scanf("%d"&N);
        printf("%d\n",dfs(0));
    }
}
int dfs(int sum)
{
    if (sum > N)
        return 0;
    if (sum == N)
        return 1;
    int cnt = 0;
    for (int i = 1; i <= 3++i)
    {
        cnt+=dfs(sum + i);
    }
    return cnt;
}
cs


<풀이>

dfs로 해도 되고, dp로 풀어도 된다.

n이 최대 10이기 때문에

dfs로 해도 되지만

n이 커지면 dp로 풀어야 된다.



<dp_소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int dp[11= { 1, };
int main()
{
    for(int i=1;i<=10;++i)
        for (int j = i - 1; j >= i - 3--j)
            if (j >= 0)
                dp[i] += dp[j];
    int T,N;
    scanf("%d"&T);
    while (T--)
    {
        scanf("%d"&N);
        printf("%d\n", dp[N]);
    }
}
cs


<풀이>

5를 만들수있는 경우의 수는

4에서 1을 추가한 경우,

3에서 2를 추가한 경우,

2에서 3을 추가한 경우

로 나타낼 수 있으므로

4를 만드는 경우의 수 + 3을 만드는 경우의 수 + 2를 만드는 경우의 수이다.

앞에서부터 쭉쭉 만들어나가면 된다.




'알고리즘 풀이 > DP' 카테고리의 다른 글

백준 9084 동전  (0) 2018.08.17
백준 1005 ACM Craft  (0) 2018.08.06
백준 14501 퇴사 :: 들짐승  (1) 2018.07.22

+ Recent posts