用于求出最小数量的精确平方的算法,其数量为n

yan*_*nis 0 algorithm math dynamic time-complexity

我应该用一个参数编写一个函数,n函数应该计算最小数量的精确平方n.例如,如果n = 10,则函数应返回2(10 = 3 2 +1 2).到目前为止,我已经实现了一些使用动态编程的解决方案,但我并不完全确定它的正确性:

Squares(n)
  dyn[0...n]
  dyn[0] <- 0 

  for k <- 1 to n
       dyn[k] <- k+1
       i <- 1
       j <- 1

       while j<=k do
          if dyn[k-j] < dyn[k]
               dyn[k] <- dyn[k-j]
          i <- i+1
          j <- i*i

      dyn[k] <- dyn[k]+1
   k <- n

   return dyn[n]
Run Code Online (Sandbox Code Playgroud)

请分析我的解决方案,如果能提供更快的解决方案?到目前为止,它的运行时间是O(n 3/2).

Sal*_*ali 8

你不需要这些.你必须知道一些数学的东西.

  1. 有些数字已经是正方形 int(sqrt(x))**2 == x
  2. 有些数字可以表示为2个方格的总和(费马)
  3. 一些数字可以表示为3个方格的总和(勒让德)
  4. 每个数字可以表示为4个方格的总和(拉格朗日)

    因此,只需检查前两个条件,如果没有,则返回4.