본문 바로가기

Algorithm/BOJ (백준)

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

1699 제곱수의 합

 

1699번: 제곱수의 합

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

www.acmicpc.net

C++

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef long long ll;

int DP[100003] = {0, };

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;

    for(int t=1; t<=n; t++) {
        for (int k = 1; k * k <= t; k++) {
            if(DP[t]==0) DP[t]=DP[t - k * k] + 1;
            else DP[t] = min(DP[t], DP[t - k * k] + 1);
        }
    }
    cout << DP[n] <<'\n';

    return 0;
}

 

작은 수부터, DP 값을 채워나간다.

만약 DP[t]가 0이라면, (아직 채워지지 않았다면), 초기화를 진행하고

그렇지 않은 경우에는 가능한 DP 경우 중 최솟값을 저장한다.