題目:求解一個數字最少能拆解成幾個平方數的和。
分析:動態規劃、dp。利用dp打表計算,查詢輸出。
定義狀態:f(i)為數字i拆成最少的平方數個數;
轉移方程:f(i)= min(f(i-j*j)+1),1 <= j*j <= i;
說明:╮(╯▽╰)╭。
#include <cstdio>
int f[10001];
int main()
{
for (int i = 1; i < 10001; ++ i) {
f[i] = i;
for (int j = 2; j*j <= i; ++ j) {
if (f[i] > f[i-j*j]+1) {
f[i] = f[i-j*j]+1;
}
}
}
int N, M;
while (~scanf("%d",&N))
while (N --) {
scanf("%d",&M);
printf("%d\n",f[M]);
}
return 0;
}