思路
- 动态规划
- 后一个的结果和前一个有关
- 表达式为
f[i]=(j=1->j<=sqrt(i)) min(f(i),f(i-j*j)+1)
- 动态规划的题目一般都是有累计或累加的过程 5 = 4+1,f(5) = f(4-1 * 1)+1,f(5)=f(5-2 * 2)+1,求取f(5)最小值
#include<stdio.h>
#include<string.h>
#include<math.h>
#define min(a,b) ((a)<(b)?a:b)
int numSquares(int n){
int flag[n+1];
int i=0,j=0;
for(i=0;i<=n;i++)
flag[i]=n+1;
i=1;
flag[0] = 0;
for(i=1 ;i<=n;i++){
for(j=1;j<=sqrt(i);j++){
flag[i] = min(flag[i],flag[i-j*j]+1);
}
}
return flag[n];
}
int main(){
int n=13;
int re = numSquares(n);
printf("re = %d\n",re);
}