Math 在集合的均方根为整数的情况下,如何查找整数列表(多集合,大小为n)?

Math 在集合的均方根为整数的情况下,如何查找整数列表(多集合,大小为n)?,math,rms,Math,Rms,我已经找到了 暴力当然是可能的,但还有其他方法吗?有没有办法找到所有的多重集?有没有办法找出在某一限制下存在多少组合 也许这个问题太数学了,如果是这样的话,我会提出它 我在javascript中通过生成数字列表的所有可能组合,然后检查整数RMS来创建。但这些是集合,而不是多集合。编辑:我使用N表示和值,K表示平方数 多个集合的数量增长很快,所以N应该有一个合理的值。因此,这个问题相当于用K个货币改变N的总和,这些货币的名称是1,4,9,25…(变量的数量可以使用动态规划计算) 最简单的实现是递归

我已经找到了

暴力当然是可能的,但还有其他方法吗?有没有办法找到所有的多重集?有没有办法找出在某一限制下存在多少组合

也许这个问题太数学了,如果是这样的话,我会提出它


我在javascript中通过生成数字列表的所有可能组合,然后检查整数RMS来创建。但这些是集合,而不是多集合。

编辑:我使用N表示和值,K表示平方数

多个集合的数量增长很快,所以N应该有一个合理的值。因此,这个问题相当于用K个货币改变N的总和,这些货币的名称是
1,4,9,25…
(变量的数量可以使用动态规划计算)

最简单的实现是递归的——我们只生成所有可能的加数。在我的Delphi实现中,为了简单起见,我收集字符串(而不是列表)中的summand

注意,这样的实现可能会一次又一次地生成相同的序列——在我的示例中,注意
{5,7}
结束序列。为了提高性能(对于较大的N和K值很重要),有必要将生成的序列存储在表或映射中(使用
{N;K;Min}
键)。在这种情况下,从大求和生成小求和会更好,因为小求和会产生大量重复模式

procedure FSP(N, K, Minn: Integer; Reslt: string);
var
  i: Integer;
begin
  if (K = 0) then begin
    if (N = 0) then
      Memo1.Lines.Add(Reslt); //yield result
    Exit;
  end;

  i := Minn;
  while (i * i <= N) do begin
    FSP(N - i * i, K - 1, i, Reslt + Format('%d ', [i]));
    i := i + 1;
  end;
end;

procedure FindSquarePartitions(N, K: integer);
begin
  FSP(N, K, 1, '');
end;

 FindSquarePartitions(101, 5);

1 1 1 7 7 
1 1 3 3 9 
1 1 5 5 7 
1 2 4 4 8 
1 5 5 5 5 
2 2 2 5 8 
2 3 4 6 6 
2 4 4 4 7 
3 3 3 5 7
procedure-FSP(N,K,Minn:Integer;Reslt:string);
变量
i:整数;
开始
如果(K=0),则开始
如果(N=0),则
备忘录1.行。添加(Reslt)//产量结果
出口
结束;
i:=明尼苏达州;

虽然(我*我认为这对这个网站的数学有点重要。你需要唯一性吗?找到一个多重集很简单。我认为你最好在math.stackexchange.com上找一些丢番图方程专家。总和的范围是有限的吗?@MBo不,一点也不,但让我们说我们正在寻找find_rms_整数(n,r)其中n=列表的大小,r=选择的rms值谢谢,非常有趣