1. 程式人生 > >dp基礎之劃分型劃分最少完全平方數個數

dp基礎之劃分型劃分最少完全平方數個數

問題:給定一個正整數n,問:最少可以將n分成幾個完全平方數(1 4 9 16..)之和?

例:
輸入:n = 13
13 = 4+9
輸出:2

分析:
狀態確定:最優策略中最後一步,假設n的最優劃分的最後一個平方數是j,
則需要知道n-j^2的最優劃分

轉移方程:
設:f[i]表示i的最優劃分的個數
        f[i] = min{f[i-j^2]+1}(0<=j*j<i)

初始情況:
f[0] = 0

計算順序:
f[1]...f[n]
答案是f[n]

i從0到n,j從0到sqrt(i),時間複雜度是O(n^1.5)

程式碼及註釋如下:

def perfect_squares(n):
    #初始f[0] = 0
    f = [0 for i in range(n+1)]
    for i in range(1,n+1):
        f[i] = sys.maxsize
        for j in range(1,int(i**0.5)+1):
            if f[i-j**2]+1 < f[i]:
                f[i] = f[i-j**2]+1
    return f[n]
n = 13
print(perfect_squares(n))
#答案:2