一尘不染

将自然数表示为不同平方的总和

algorithm

问题是找到最大的正整数集S,以使S的元素的平方和等于给定数n。

例如:

4 =
2²20
=4²+ 2²38 =5²+3²+
2²300 =11²+8²+7²+6²+4²+3²+2²+1²。

我有一个可以及时运行的算法O(2^(sqrt n) * n),但是它太慢了(每个正方形的子集)。


阅读 291

收藏
2020-07-28

共1个答案

一尘不染

O(n^1.5)一种基于规范动态程序的子集和算法。这是重复发生的情况:

C(m, k) is the size of the largest subset of 1..k whose squares sum to m
C(m, k), m < 0 = -infinity (infeasible)
C(0, k) = 0
C(m, 0), m > 0 = -infinity (infeasible)
C(m, k), m > 0, k > 0 = max(C(m, k-1), C(m - k^2, k-1) + 1)

计算C(m, k)所有m0..n和所有k0..floor(n^0.5)。返回C(n, floor(n^0.5))目标值。要恢复该集合,请追溯argmaxes。

2020-07-28