问题:给定一个正整数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