类型:DP
题目:http://acm.timus.ru/problem.aspx?space=1&num=1073
思路:状态f(i)表示整数i至少能由f(i)个平方数组和而成
则:f(i) = min(f(i - k^2) + 1)
// ural 1073. Square Country
// ac 0.046s
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
int n;
int dp[60010];
void solve() {
int i, j;
cin>>n;
FORE(j, 1, n) {
dp[j] = 0x7f7f7f7f;
FORE(i, 1, 270) {
if(j - i * i < 0)
break;
dp[j] = min(dp[j], dp[j - i * i] + 1);
}
}
cout<<dp[n]<<endl;
}
int main() {
solve();
return 0;
}