끄적끄적 코딩
article thumbnail
728x90

모든 자연수는 제곱수 최대 4개로 만들 수 있다고 합니다.
자연수가 주어졌을 때 제곱수 최소 몇개로 그 자연수를 만들 수 있는지 구하는 문제입니다.

1부터 차례대로 최적의 수를 구해나갑니다.
그래서 n개일 때 i보다 작은 제곱수로 빼보고 그 때 남은 수의 최적 경우가 가장 적을 때
그 값 + 1을 해줌으로서 해당값의 대한 결과값을 구할 수 있습니다.
그리고 결과값을 저장하고 이를 반복해서 모든 값에 대한 최적수를 구할 수 있습니다.

 

<c++ />
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #define MAX 987654321 using namespace std; int main(int argc, char* argv[]) { int n; int minNum; int DP[50010]; vector<int> v; memset(DP, 0, sizeof(DP)); cin >> n; DP[0] = 0; DP[1] = 1; for (int i = 1; i < 230; ++i) { v.push_back(i * i); } for (int i = 2; i <= n; ++i) { minNum = MAX; for (int j = 0; v[j] <= i; ++j) { int tmp = i - v[j]; minNum = min(minNum, DP[tmp]); } DP[i] = minNum + 1; } cout << DP[n] << endl; return 0; }

검색 태그