Notice
Recent Posts
Recent Comments
Link
거의 알고리즘 일기장
백준 1699번 _ 제곱수의 합 본문
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는
www.acmicpc.net
풀이방법
제곱수를 미리 구해놓음
void powNumberInit()
{
powNumber[1] = true;
for (int i = 4; i <= n; i++)
{
int tmp = (int)sqrt(i);
if (i == tmp*tmp)
powNumber[i] = true;
}
}
그이후 동전 2와 똑같이 풀면 됨.
https://kunkunwoo.tistory.com/131
백준 2294번 _ 동전 2
https://www.acmicpc.net/problem/2294 2294번: 동전 2 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작..
kunkunwoo.tistory.com
전체코드
#include <iostream>
#include <algorithm>
#include <math.h>
#define INF 987654321
using namespace std;
bool powNumber[100001];
int n;
int dp[100001];
void dpInit()
{
for (int i = 1; i <= n; i++)
dp[i] = INF;
}
void powNumberInit()
{
powNumber[1] = true;
for (int i = 4; i <= n; i++)
{
int tmp = (int)sqrt(i);
if (i == tmp*tmp)
powNumber[i] = true;
}
}
void solve()
{
for (int i = 1; i <= n; i++)
{
if (powNumber[i] == false)
continue;
for (int j = 1; j <= n; j++)
{
if (j % i == 0)
dp[j] = min(j / i, dp[j]);
if (dp[j] == INF)
continue;
if (j + i <= n)
dp[j + i] = min(dp[j + i], dp[j] + 1);
}
}
}
int main()
{
cin >> n;
powNumberInit();
dpInit();
solve();
cout << dp[n];
return 0;
}
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
백준 11057번 _ 오르막 수 (0) | 2020.05.09 |
---|---|
백준 10844번 _ 쉬운 계단 수 (0) | 2020.05.09 |
백준 2294번 _ 동전 2 (0) | 2020.05.09 |
백준 9465번 _ 스티커 (0) | 2020.05.09 |
알고스팟 _ LIS, 백준 12015번 _가장 긴 증가하는 부분 수열 2 (0) | 2020.05.08 |
Comments