題目描述
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...
)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n = 12
輸出: 3
解釋: 12 = 4 + 4 + 4.
示例 2:
輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.
解題思路
利用動態規划思想解題,初始化dp數組令小於n的完全平方數為1,從1到n遍歷求解最小組成個數,再對每個數遍歷小於其的所有完全平方數,最小組成個數的狀態轉移方程為:
dp[i] = min(dp[i], dp[i - j * j] + 1)
代碼
1 class Solution { 2 public: 3 int numSquares(int n) { 4 vector<int> dp(n + 1, INT_MAX); 5 for(int i = 1; i * i <= n; i++) 6 dp[i * i] = 1; 7 for(int i = 1; i <= n; i++) 8 for(int j = 1; j * j < i; j++) 9 dp[i] = min(dp[i], dp[i - j * j] + 1); 10 return dp[n]; 11 } 12 };