数N 等于 m 个数的平方和。 求 m 的 最小值。。。
第 i 个数 。。。考虑 1 ~ sqrt ( n ) 之间 取与不取。
所以动态方程为
f[i] = min ( f[i], f[i - j * j] + 1);
#include <cstdio>
#include <algorithm>
using namespace std;
int f[60001], i, j, n;
int main ( ) {
for ( i = 1; i < 60001; f[i] = 1000000, ++i ) ;
for ( i = 1; i * i < 60001; f[i * i] = 1, ++i ) ;
for ( i = 1; i < 60001; ++i )
for ( j = 1; j * j < i; ++j )
f[i] = min ( f[i], f[i - j * j] + 1 );
scanf ( "%d", &n );
printf ( "%d\n", f[n] );
}