問題分析:
給定一個正整數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];
}
};