Algorithm

[백준] 알고리즘 1699번 - 제곱수의 합 문제

낭강 2020. 12. 11. 14:08

#include <bits/stdc++.h>
using namespace std;
int dp[100001];

int main() 
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n;
	cin >> n;
	dp[0] = 1;
	for (int i = 1; i <= n; i++) {
		dp[i] = i;
		for (int j = 1; j * j <= i; j++) {
			if (j * j == i)dp[i] = 1;
			else dp[i] = min((dp[i - j*j] + 1),dp[i]);
		}
	}
	cout << dp[n];
	return 0;
}

1=1^2

2=1^2+1^2 이런식으로 제곱수의 합으로 나타낼 수 있는 최소의 개수를 구하는것이 목표이다.

dp[i] = i 번째 수의 제곱수로 나타낼 수 있는 최소의 개수를 저장한다.