DP(8)

Square Country

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

There live square people in a square country. Everything in this country is square also. Thus, the Square Parliament has passed a law about a land. According to the law each citizen of the country has a right to buy land. A land is sold in squares, surely. Moreover, a length of a square side must be a positive integer amount of meters.
Buying a square of land with a side a one pays a2 quadrics (a local currency) and gets a square certificate of a landowner.
One citizen of the country has decided to invest all of his N quadrics into the land. He can, surely, do it, buying square pieces 1 × 1 meters. At the same time the citizen has requested to minimize an amount of pieces he buys: "It will be easier for me to pay taxes," — he has said. He has bought the land successfully.
Your task is to find out a number of certificates he has gotten.

Input

The only line contains a positive integer N ≤ 60 000 , that is a number of quadrics that the citizen has invested.

Output

The only line contains a number of certificates that he has gotten.

Sample Input

inputoutput
344
3
 
#include<cstdio>
#include<cmath>
#include<algorithm>
const int INF = 0x3f3f3f3f;
const int maxn = 245;
using namespace std;
int dp[maxn][maxn*maxn];
int main(){
    int n;
    scanf("%d",&n);
    int edge_max = sqrt((double)n);
    for(int i = 0; i <= edge_max; i++)
        for(int j = 0; j <= n; j++)
            dp[i][j] = INF;//初始化;
    dp[0][0] = 0;//!!
    for(int i = 1; i <= edge_max; i++){//枚举每个边长
        for(int j = 0; j <= n; j++)
            dp[i][j] = dp[i-1][j];//先不 购买 边长为i时的dp值;
        for(int j = i*i; j <= n; j++)//枚举 花的钱 去购买 边长为 i 的 square;
            dp[i][j] = min(dp[i][j-i*i]+1,dp[i][j]);//比较 购买 边长为 i 的square,和 不购买 时 的 dp值;
    }
    printf("%d\n",dp[edge_max][n]);
    return 0;
}

 

posted @ 2015-08-29 09:45  Tobu  阅读(408)  评论(0)    收藏  举报