------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
#define N 100001
int dp[N],basic = 0;
void dynamicP(int a)
{
for (int i = 1; i <= a; i++)
{
int c = pow(basic, 2);
if (i == pow(basic+1, 2)) // 1 or 4 or 9 or 16같은 제곱수는 바로 1을 넣어버림 .
{ // basic은 1 or 4 or 9를 찾을 때 쓰는 변수이다.
dp[i] = 1;
basic++;
continue;
}
dp[i] = dp[c] + dp[i-c]; // 탐욕 알고리즘처럼 일단 바로바로 최선의 최소개수를 넣고
for (int j = 1; j <= i / 2; j++)
{
if (dp[i] > dp[i - j] + dp[j]) // 탐욕은 각각의 선택에선 최선이지만 전체적으론 최선이 아닐수도 있으니
dp[i] = dp[i - j] + dp[j]; // 조건을 주어 최적의 해를 찾아줌
}
}
}
int main()
{
int a;
scanf("%d",&a);
dynamicP(a);
printf("%d",dp[a]);
return 0;
}
'알고리즘' 카테고리의 다른 글
맨하탄 거리 측정법 과 유클리드 거리 측정법 (0) | 2017.01.19 |
---|---|
2531번 회전초밥 (조건변경으로 난이도 업) (0) | 2017.01.12 |
2479번 경로 찾기 (0) | 2017.01.11 |
2531번 회전초밥 (0) | 2017.01.08 |
Visual Studio 주석처리 , 자동 정렬 (0) | 2016.12.26 |