본문 바로가기

BOJ

백준 15989 / 1,2,3 더하기 4





1,2,3을 이용하여 수를 만드는데 중복 없이 만드는 경우의 수를 묻는 문제이다.


코드를 보면



코드


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
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<memory.h>
 
using namespace std;
 
 
int d[10001];
 
int main() {
 
    //freopen("Text.txt", "r", stdin);
 
    int testcase;
    cin >> testcase;
 
    int nums[3= { 1,2,3 };
 
    d[0= 1;
    
    for (int j = 0; j < 3; j++) {
        for (int i = 1; i <= 10000; i++) {
            if (i - nums[j] >= 0) {
                d[i] += d[i - nums[j]];
            }
        }
    }
 
    while (testcase--) {
        int n;
        cin >> n;
        cout << d[n] << endl;
    }
}
cs



25~31번째 줄 for문이 핵심인데,


25번째 줄과 26번째 줄을 바꾸면 중복가능(1,1,2와 1,2,1를 다른것으로 치는) 경우 개수가 나온다.



중복이 가능한 경우의 점화식이


d[n] = d[n-1] + d[n-2] + d[n-3]


에서 d[n-1]과 d[n-2], d[n-3]를 먼저 구한다음 d[n]을 구하지말고


1만 써서 표현할 수 있는 개수, 2만 써서 표현할 수 있는 개수, 3만 써서 표현할 수 있는 개수를


d[n]에 각각 더해주면서 구하면 중복이 없는 경우만 뽑아 넣을 수 있게 된다.

'BOJ' 카테고리의 다른 글

백준 11058 / 크리보드  (0) 2019.02.10
백준 2293 / 동전 1  (0) 2019.02.10
백준 10942 / 팰린드롬?  (0) 2019.02.09
백준 1890 / 점프  (0) 2019.02.08
백준 11048 / 이동하기  (0) 2019.02.08