给一个正整数 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]; } };