1.题目链接
点击这里!
2.解题思路
DP的思想,站在某个状态考虑他可能由哪些状态推出:对于n,他可能由 (n - 一个完全平方数) 推出,这样的话,用 f[i] 代表数i的最少完全平方数,它是由 f[i - (符合(i - 完全平方数 >= 0)的这个完全平方数)] 推出来的。
我们不妨先把所有n上限以内的所有完全平方数打表,这样在写DP的循环时就比较直观,不容易搞错了。
3.代码
class Solution {
public:
int numSquares(int n) {
int s[10010],cnt=0;
memset(s,0,sizeof(s));
for(int i=1;i<=100;i++){
//找出所有10000以内的完全平方数
s[cnt++]=i*i;
}
int f[10010];
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++){
f[i]=1e9;//因为要求最小值,所以我们先把f[i]开到很大很大,方便使用min
for(int j=0;j<cnt&&i-s[j]>=0;j++){
int mid=f[i-s[j]];
f[i]=min(f[i],mid+1);
}
}
return f[n];
}
};