问题分析:
给定一个正整数n,找到若干个完全平方数(比如1,4,9,16,...)使得它门的和为n,你需要让其组成的完全平方数的个数最少。
问题分析:
这是一个典型的动填规划问题。关键在于如何查找动态转移方程,我们假设前面的已经知道最小的个数dp[i],然后继续求解dp[i-j*j]+1这个数的最小值。
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,0);
for(int i=1;i<=n;i++)
{
dp[i]=i; //最多是全部由1组成
for(int j=1;i-j*j>=0;j++)
{
dp[i] = min(dp[i],dp[i-j*j]+1); //表示状态转移方程,保存当前这个数被分解的的最小值
}
}
return dp[n];
}
};