1

下面的代码将为您有四个不同变量时可能发生的所有可能组合创建一个数组。变量总是需要等于 1。我创建的 for 循环可以工作,并且我了解如何使其适用于更多变量,但我可以让它动态化吗?我需要一个函数,它有多少个变量作为参数。如果有三个变量,则创建三个 forloop。如果有 10... 创建 10 个对应的 for 循环以确定所有可能的组合。

$anarray2 = array();
for( $a = 1; $a <= 97; $a++ ) {
  for( $b = 1; $a + $b <=98 ; $b++ ) {
    for( $c = 1; $a + $b + $c <= 99; $c++ ) {
      $d = 100 - ( $a + $b + $c );
      $var_1 = $a / 100;
      $var_2 = $b / 100;
      $var_3 = $c / 100;
      $var_4 = $d / 100;
      $anarray2[] = array( $var_1, $var_2, $var_3, $var_4 );
    }
  }
}
print_array( $anarray2 );
4

1 回答 1

0

您正在有效地寻求以所有不同的可能方式I与人们分享相同的项目。N

如果只有一个人 ( N==1),那么只有一种方法可以做到这一点 - 给那个人所有的I物品。

如果有不止一个人(N>1),那么我们可以考虑有多少项目可以分配给第一个人,然后N-1在每种情况下剩下的人可能分配什么。

这导致了一个很好的递归解决方案。首先我们解决问题N=1

function assign($I, $N) {
    $anarray = array();

    if ($N == 1) {
        $anarray[] = array($I);
    } else {
        // Coming up...
    }

return $anarray;
}

现在我们用N=k(一些常数)的方式来N=k-1解决问题——也就是说,我们使用解决方案来解决更小的问题。这将一路回到解决方案时N=1

function assign($I, $N) {
    $anarray = array();

    if ($N == 1) {
        $anarray[] = array($I);
    } else {
        for ($i = $I; $i < $I; $i++) {
            foreach (assign($I - $i, $N - 1) as $subproblem) {
                $anarray[] = array_merge(array($i), $subproblem);
            }
        }
    }

    return $anarray;
}    

像这样的东西应该可以完成这项工作。

于 2012-06-06T11:44:44.363 回答