当做一般动态规划来做。
tar = int(input())
# dp[i] 是和为i+1所需的完全平方数的最小数量
dp = [float('inf') for _ in range(tar)]
# 初始化:记录完全平方数的位置
for i in range(int(tar**0.5)):
dp[(1+i)**2-1] = 1
sqrs = []
# 动态规划迭代
for i in range(tar):
if dp[i] == 1: # i+1是完全平方数
sqrs.append(i+1)
else:
# choice是加上某个完全平方数之后等于i+1的所有数字,即i+1是在某个choice的基础上再加一个完全平方数
choice = [i-sqr for sqr in sqrs]
dp[i] = 1+min([dp[idx] for idx in choice])
print(dp[-1])