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
.
给你一个数,问最少能用多少个完全平方数组成。最少。
动态规划美滋滋啊。
dp[0] = 0
dp[1] = dp[0]+1 = 1
dp[2] = dp[1]+1 = 2
dp[3] = dp[2]+1 = 3
dp[4] = Min{ dp[4-1*1]+1, dp[4-2*2]+1 }
= Min{ dp[3]+1, dp[0]+1 }
= 1
dp[5] = Min{ dp[5-1*1]+1, dp[5-2*2]+1 }
= Min{ dp[4]+1, dp[1]+1 }
= 2
所以,dp[n] = min{ dp[n - i * i] + 1 }, n - i * i >= 0 && i >= 1
class Solution {
public:
int numSquares(int n) {
if (n <= 0) return 0;
vector<int> dp(n+1, INT_MAX);
dp[0] = 0;
for (int i = 0; i <= n; ++i) {
for (int j = 1; j * j <= i; ++j)
dp[i] = min(dp[i], dp[i - j*j] + 1);
}
return dp[n];
}
};