题意:
有N块钱,购买一块边长为a的正方形需要花a*a块钱,现在给出N,求怎样使得到的块数最少。
递推就可以了。
//DP 题 dp的状态转移有点问题,找最近的可以开方的数不一定正确 要找分解的最合适的 比如 18 分解为9+9 =2 16+1+1 =3
// 所以要遍历 所有可能求出最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define inf 60005
int d[inf];
void init()
{
memset(d,0,sizeof(d));
d[1]=1;
}
int main()
{
// freopen("q.in","r",stdin);
int n;
int i,j;
scanf("%d",&n);
init();
for(i=2;i<=n;i++)
{
int mmin=100000000;
for(j=1;j*j<=i;j++)
{
if(mmin>d[i-j*j]+1)mmin=d[i-j*j]+1;
}
d[i]=mmin;
}
cout<<d[n]<<endl;
}