【问题标题】:Decomposing squared integer input to sum of squared integers less than input?将平方整数输入分解为小于输入的平方整数之和?
【发布时间】:2021-02-09 02:02:46
【问题描述】:

我有一个问题如下:

给定一个正整数 n,返回一个严格递增的数字序列(列表/数组/字符串,取决于语言),使得平方和等于 n²。

decompose(11) 必须返回 [1,2,4,10]。请注意,实际上有两种方法可以分解 11²,11² = 121 = 1 + 4 + 16 + 100 = 1² + 2² + 4² + 10² 但不返回 [2,6,9],因为 9 小于 10 (如果可以使用多个平方整数序列,则使用最大的一个 - 所以在上述情况下是 10 而不是 9)。

对于 decompose(50) 不要返回 [1, 1, 4, 9, 49] 而是 [1, 3, 5, 8, 49] 因为 [1, 1, 4, 9, 49] 不是严格递增的序列。

我无处可去,尝试这个(可能做得不好):

function sq2squares($n) {

     $starting = ($n - 1) ** 2;
     $square = $n**2;
     $range = range(1, $n -1);
     $start = $square - $starting;

     foreach($range as $r => $v) {
          if($v**2 > $start) {
               unset($range[$r]);
          }
     }

    # $range here is [1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    foreach(array_reverse($range) as $r) {
        if($r**2 < $start) {
            $start -= $r**2;
        }
    }

    print_r($results); // [49] || Should be: [1,3,5,8,49] 

}

我已经从最大的下一个数字 (49) 中减去输入的平方,剩下 99。然后我想迭代 $range (9-1) 中的剩余整数并减去每个整数,但前提是所得的减法结果为 @ 987654324@ 为 0。最后一部分是我无法弄清楚的。

如何遍历数组$range 并且只有array_push() 值导致$start 为0?谢谢。

【问题讨论】:

  • since 9 is smaller than 10 这没有意义。
  • 这意味着如果有多个整数的平方和等于输入,则选择最大的整数。那有意义吗?谢谢。
  • 虽然我并不太关心那部分,但我不太明白如何从$range 中减去剩余的整数,以便最终的减法将$start 设置为0?然后将这些元素推入包含 49 的数组中。
  • 这和subset sum problem非常相似
  • @nice_dev:是的,我对任何其他方法持开放态度。我只是在努力学习。谢谢!

标签: php arrays algorithm


【解决方案1】:
  • 我们首先创建一个数组$dp,然后用-1填充所有值。

  • -1 表示无法在迭代中形成该特定数字的平方和。

  • $dp[1] = 1 初始化为基本情况。

  • 我们从 2 迭代到 $value,其中 $value 是平方形式。(121 代表值 11)。

  • 对于下面代码中的每个$i,我们从$i 的平方根移动到1 寻找平方和解决方案。

  • 如果$dp[$i - $j * $j] != -1 存在,则表示之前的问题,即$i - $j * $j 已解决,意思是,我们可以将其表示为平方数之和,$dp[$i - $j * $j] &lt; $j 表示我们正在寻找严格递增的检查相对于先前的子问题具有更大数字的序列。如果两者都为真,则分配$dp[$i] = $j

  • 最后,我们需要收集值。我们只需跳转到之前的子问题,然后将当前子问题的值添加到结果中。

片段:

<?php

function decompose($value){
    $value *= $value;
    $dp = array_fill(0,$value + 1,-1);
    $dp[1] = 1;
    for($i = 2; $i <= $value; ++$i){
        for($j = intval( sqrt($i) ); $j >= 1; --$j){
            if($dp[$i - $j * $j] != -1 && $dp[$i - $j * $j] < $j){ // meaning can be represented as sum of squares
                $dp[$i] = $j;
                break; // since we are looking for sequence with greater numbers
            }
        }
    }
    
    $result = [];
    $curr = $value;
    // just collect all values
    while($dp[$curr] != -1){
        $result[] = $dp[$curr];
        $curr -= $dp[$curr] * $dp[$curr];
    }
    
    return $result;
}

演示: https://3v4l.org/DEH9f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2015-03-04
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多