algorithm - 将自然数表示为不同平方和

标签 algorithm number-theory

问题是找到最大的正整数集合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(n^1.5) 时间算法基于 subset sum 的规范动态程序.这是重复的:

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)

0..n 中的所有 m 和所有 k 计算 C(m, k) 0..floor(n^0.5)。为目标值返回 C(n, floor(n^0.5))。要恢复集合,请追溯 argmax。

关于algorithm - 将自然数表示为不同平方和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222693/

相关文章:

algorithm - 为什么 "Longest Common Subsequence"使用编辑距离方法禁止 "substitution"

algorithm - 获得 e 值的最快方法是什么?

c++ - 合并按 vector 排序的 N C++

php - 分别生成64个字符的十六进制字符串

c# - 寻找完美数字(优化)

python - 统一成本解决方案中的算法问题

algorithm - [1,1e18] 中不能被 [2,10] 中的任何整数整除的正整数个数

python - 给定一百万个数字的字符串,返回所有重复的 3 位数字

javascript - 检查给定的数字是否快乐

algorithm - 调整图像大小以包含恰好 120 像素,并尽可能保持纵横比