給一個正整數 n, 找到若干個徹底平方數(好比1, 4, 9, ... )使得他們的和等於 n。你須要讓平方數的個數最少。code
給出 n = 12, 返回 3 由於 12 = 4 + 4 + 4。
給出 n = 13, 返回 2 由於 13 = 4 + 9。it
思路:
採用動態規劃的思想:
一個數x能夠表示爲一個任意數$a$加上一個平方數$b*b$,也就是$x=a+b*b$;
$dp[a]$就是和獲得$a$須要的最少平方數;
$dp[b*b]$的值是$1$$。io
class Solution { public: /* * @param n: a positive integer * @return: An integer */ int numSquares(int n) { // write your code here if(n == 0) return 0; vector<int> dp(INT16_MAX, n+1); for(int i=0; i*i<=n; i++){ dp[i*i] = 1; } //動態規劃;一個數x能夠表示爲一個任意數a加上一個平方數bxb,也就是x=a+bxb for(int i=1; i<n; i++){ for(int j=1; j*j+i<=n; j++){ dp[i+j*j] = min(dp[i]+1, dp[j*j+i]); } } return dp[n]; } };