주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오.
i
라고 가정하자. 이때 i
의 범위는 이다.#include <iostream>
using namespace std;
int N;
int dp[100001];
int solve(int num) {
for (int i = 1; i <= num; ++i) {
dp[i] = i; // 1의 제곱으로만 이루어진 경우 = 최대값
for (int j = 1; j * j <= i; ++j)
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
return dp[num];
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N;
cout << solve(N) << '\n';
}