问题是找到最大的正整数集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),但是它太慢了(每个正方形的子集)。
O(2^(sqrt n) * n)
有O(n^1.5)一种基于规范动态程序的子集和算法。这是重复发生的情况:
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)所有m的0..n和所有k的0..floor(n^0.5)。返回C(n, floor(n^0.5))目标值。要恢复该集合,请追溯argmaxes。
C(m, k)
m
0..n
k
0..floor(n^0.5)
C(n, floor(n^0.5))