1073. Square Country
Time limit: 1.0 second
Memory limit: 64 MB
Memory limit: 64 MB
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
a
2 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 | output |
---|---|
344 | 3 |
Problem Author: Stanislav Vasilyev
Problem Source: Ural State Univerisity Personal Contest Online February'2001 Students Session
Problem Source: Ural State Univerisity Personal Contest Online February'2001 Students Session
Difficulty: 155
Printable version
Submit solution
Discussion (52)
All submissions (29522) All accepted submissions (9643) Solutions rating (7464)
代码:
/*
题目就是说有1,4,9,16, ...i*i的背包;
装到容量为n的背包中,要求种类数最少。。
就是完全背包嘛。
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int INF = 1e5+7;
const int maxn = 6e4+7;
int n, a[300], dp[maxn];
void init()
{
for(int i = 1; i < 300; i++) a[i] = i*i;
for(int i = 0; i < maxn; i++) dp[i] = INF;
dp[0] = 0;
}
int main()
{
init();
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n))
{
int nmin = INF;
for(int i = 1; i <= sqrt(n); i++)
{
for(int j = a[i]; j <= n; j++)
{
dp[j] = min(dp[j], dp[j - a[i]]+1);
}
}
printf("%d\n", dp[n]);
}
return 0;
}