Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.
For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.
这个题首先想到的就是动态规划的解法,先找到递推公式:f(n)=min(f(n-j*j)+1, f(n-i*i)+1, ....).所以可以从1开始找f(n),代码如下:
class Solution {
public:
int numSquares(int n) {
if(n<=0) return 0;
vector<int> sq_n(n+1,0);
int i=2;
sq_n[1]=1;
while(i<=n){
int min_tmp=INT_MAX;
int j=1;
while(j*j<=i){
min_tmp=min(min_tmp,sq_n[i-j*j]+1);
j++;
}
sq_n[i]=min_tmp;
i++;
}
return sq_n[n];
}
};

本文探讨了如何找出正整数n能表示为最少数量的完全平方数之和的方法,并提供了一个使用动态规划解决该问题的C++实现。
524

被折叠的 条评论
为什么被折叠?



