我必须使用指定的数字填充数组:
例如:
可能的结果:
array(23, 70, 37)
现在该怎么办?如何分割/分割我的号码?
我从这开始(伪代码):
i=0;
while(sum(number) > 0 and i < arraykeys){
x = randomize(from, to)
number = number - x
myarray[i] = x
i++
}
答案 0 :(得分:2)
这应该适合你:
<强>加工性强>
我们需要检查的第一件事是,是否可以用范围内的数字构建目标:
if(checkWorkability($result, $goal, $amountOfElementsLeft, $scope))
意味着它只使用可能的最高值并查看它是否大于目标。
while循环
在while循环中,我们需要检查是否还有剩余的元素可以使用:
while($amountOfElementsLeft > 0)
范围调整
每次迭代我们都需要检查是否需要调整范围,以便最终我们能够建立目标。
这意味着如果当前的数字总和+最高可能的数字大于目标,我们需要使范围的最大值更小。
另一方面,当我们无法达到目标时,我们需要让范围的最小值更大。
<?php
$goal = 130;
$amountOfElementsLeft = 3;
$scope = [23, 70];
$result= [];
function adjustScope(array $result, $goal, $amountOfElementsLeft, $scope) {
$newScope = $scope;
if($amountOfElementsLeft == 1) {
$leftOver = $goal - array_sum($result);
return [$leftOver, $leftOver];
}
if((($goal - (array_sum($result) + $scope[1])) / ($amountOfElementsLeft - 1)) < $scope[0])
$newScope[1] = (int) ($goal - array_sum($result)) / ($scope[0] * ($amountOfElementsLeft - 1));
elseif(($adjustTop = $goal - array_sum($result)) < $scope[1])
$newScope[1] = $adjustTop;
if(($adjustBottom = $goal - (array_sum($result) + $scope[0] + (($amountOfElementsLeft - 1) * $scope[1]))) < $goal && $adjustBottom > 0)
$newScope[0] = $scope[0] + $adjustBottom;
return $newScope;
}
function checkWorkability(array $result, $goal, $amountOfElementsLeft, $scope) {
if(array_sum($result) + $amountOfElementsLeft * $scope[1] >= $goal)
return TRUE;
return FALSE;
}
if(checkWorkability($result, $goal, $amountOfElementsLeft, $scope)) {
while($amountOfElementsLeft > 0) {
$scope = adjustScope($result, $goal, $amountOfElementsLeft, $scope);
$result[] = rand($scope[0], $scope[1]);
$amountOfElementsLeft--;
}
}
print_r($result);
echo array_sum($result);
?>
可能的输出:
Array
(
[0] => 58
[1] => 30
[2] => 42
) -> 130
Array
(
[0] => 35
[1] => 54
[2] => 41
) -> 130
Array
(
[0] => 52
[1] => 51
[2] => 27
) -> 130