原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1073
分析:dp,dp[i]表示钱为i且恰好用完时能买的最少土地数,易知dp[i]=min(i,dp[i-j*j]+1)(1<=j<=sqrt(i)).
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 60005
using namespace std;
int dp[maxn];
void solve()
{
memset(dp,0,sizeof(dp));
dp[0]=0;dp[1]=1;dp[2]=2;dp[3]=3;dp[4]=1;
for(int i=5;i<=60000;i++)
{
dp[i]=i;
for(int j=1;j*j<=i;j++)
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
int main()
{
int n;
solve();
cin>>n;
cout<<dp[n]<<endl;
return 0;
}