1.比如说f[14] = f[9] + f[4] + f[1] = 3
f[9] = 1 故 f[14] = 1 + f[14 - 9] = 1 + f[5] = 1 + f[4] + f[1]
可以得到f[n] = f[n - j * j] + 1这个状态
又例如f[13] = f[9] + f[4] = 2
初始化所有值为很大的正数 因为要取min 如果设为0就会一直取0
初始化f[0] = 0
#include <algorithm> #include <cstring> #include <iostream> using namespace std; const int N = 10010; int f[N]; int main() { int n; cin >> n; memset(f, 0x3f, sizeof f); f[0] = 0; for(int i = 1; i * i <= n; i ++){ for(int j = i * i; j <= n; j ++){ f[j] = min(f[j], 1 + f[j - i * i]); } } cout << f[n] << endl; return 0; }