어떤 자연수 N에 대하여 제곱수의 합으로 표현 할 때, 제곱수의 최소 개수를 구하는 문제
간단하게 생각하면 가장 큰 제곱수를 빼면서 0 ~ 3 사이의 결과가 나올 때 그 값을 더해 주면 된다.
위 알고리즘을 구현한 결과는 틀렸습니다.
알고보니 32 같은 반례가 존재했다.
위 알고리즘대로라면 32 = 25 + 9 + 1 + 1 로 4번이 나오지만 정답은 16 + 16 으로 2 이다.
결과에 대해서 검증하는 과정이 필요하다.
#include <iostream>
#include <cmath>
using namespace std;
const int MAX = 100000;
int dp[MAX + 1];
int min(int a, int b) { return a < b ? a : b; }
int func(int n)
{
if (dp[n]) return dp[n];
if (n == pow(int(sqrt(n)), 2))
return 1;
for (int i = 2; i <= sqrt(n); i++) {
int res = func(n - (i * i)) + 1;
if (dp[n] > res)
dp[n] = res;
}
return dp[n];
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < MAX + 1; i++)
dp[i] = i;
// dp Init
for (int i = 4; i < MAX + 1; i++)
dp[i] = func(i);
cout << dp[n];
return 0;
}
2019-01-12 14:30:00에 Tistory에서 작성되었습니다.