1. 程式人生 > >演算法64-----完全平方數【動態規劃】

演算法64-----完全平方數【動態規劃】

一、題目:

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

示例 1:

輸入: n = 12
輸出: 3 
解釋: 12 = 4 + 4 + 4.

示例 2:

輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.

二、思路:數學想法

  • 四平方和定理:每個正整數都可以表示為至多4個正整數的平方和。故該題答案為1,2,3或4.
  • 該數 n 若能整除4,則 n /= 4,結果不影響。【化簡】
  • 如果一個數除以8餘7的話,那麼肯定是由4個完全平方陣列成。return 4
  • 將其拆為兩個平方數之和,如果拆成功了那麼就會返回1或2,因為其中一個平方數可能為0,故判斷拆的兩個數是否為正整數

程式碼:

import math
    def numSquares(n):
        """
        :type n: int
        :rtype: int
        """
        #採用數學方式解決
        
        while n % 4 == 0:
            n /= 4
        if n % 8 == 7:
            return 4
        i = 0
        
while i * i <= n: b = int(math.sqrt(n - i*i)) if i * i + b * b == n: return (not (i == 0)) + (not (b == 0)) i += 1 return 3

三、動態規劃:狀態轉移方程:F(n) = min{ F(n-ai) + 1 } 其中ai為小於等於n的完全平方數

F(n)表示構成n的最少完全平方數的個數