본문 바로가기
백준

[백준] 1699 - 제곱수의 합, C++

by 황인태(intaehwang) 2020. 1. 12.
반응형

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

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는

www.acmicpc.net

 본 문제는200 7 ICPC Seoul Nationalwide Internet Competition E번 문제로 주어진 자연수 N을 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 문제다. 그렇기 때문에 자연수 N의 최소개수를 구하려면 이전에 N-x^2의 최소개수를 알아야 한다. 큰 문제를 작은문제로 구할 수 있기 때문에 DP로 풀 수 있으며, 점화식은 (1 ≤ x^2 < n) d[n] = min(d[n-x^2]) + 1으로 정의된다.

Bottom-up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
 
using namespace std;
 
int main() {
    int d[100001];
    int n;
    scanf("%d"&n);
    for (int i = 1; i <= n; i++) {
        d[i] = i;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j*<= i; j++) {
            if (d[i] > d[i-j*j] + 1) d[i] = d[i-j*j] + 1;
        }
    }
    printf("%d", d[n]);
}
cs
반응형
Buy me a coffeeBuy me a coffee

댓글