본문 바로가기

PS

BOJ - 1699번 제곱수의 합

http://acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

며칠동안 못 푼 문제다.

 

최소 몇개의 제곱수로 표현 가능한가? 를 찾는 문제다.

 

일단 DP[i] = i로 초기화 한다. 왜냐 1을 i개 더하는게 최댓값이니까

 

그리고 제곱수를 작은것부터 가져와서 생각한다.

 

제곱수를 k, 해당 수를 N이라고 한다면

 

DP[N] 이랑 DP[N-k]+1 중에 작은 것으로 DP[N]에 다시 값을 넣어주면 된다.

 

코드는 다음과 같다.

 

/* acmicpc.net - 1699번 제곱수의 합 */

#include <stdio.h>
#include <math.h>

int DP[100001];

void init() {

    int i;
    for (i = 0; i < 100001; i++) DP[i] = i;
}

int min(int a, int b) {

    if (a < b) return a;
    else return b;
}

void calDP() {

    int i, j, k;

    for (i = 2; i < (int)sqrt(100001); i++) {
        k = i * i;
        for (j = k; j < 100001; j++) DP[j] = min(1 + DP[j - k], DP[j]);
    }
}

int main() {
    int N;
    init();
    calDP();
    scanf("%d", &N);
    printf("%d\n", DP[N]);
    return 0;
}

'PS' 카테고리의 다른 글

[BOJ] 15665번 N과 M (11) 문제  (0) 2021.03.03
[BOJ] 2153번 소수 단어 문제  (0) 2021.01.19
BOJ - 2133번 타일 채우기  (0) 2020.09.08
BOJ - 1463번 1로 만들기  (0) 2020.09.03
BOJ - 10992번 별 찍기 - 17  (0) 2020.09.03